1

古い C++ コードで静的解析作業を行っていますが、私の C++ は最強ではありません。私はこのコードを持っています:

void NIDP_clDPLogger::log(TCHAR *logString)
{
    TCHAR temp_logString[1024] = {0};
    _tcsncpy(temp_logString,logString,1024);
    temp_logString[1023] = NULL;
            ...

ここで、静的分析ツールは、 logString (関数に渡されるパラメーター) のインデックスが 1024 よりも短い可能性があると不平を言っています (サイズはさまざまです。1024 が最大サイズだと思います)。したがって、私の修正は、次のようにlogStringのサイズを確認して使用することだと思います。

void NIDP_clDPLogger::log(TCHAR *logString)
{

    size_t tempSize = sizeof(logString);
    TCHAR temp_logString[tempSize] = {0};
    _tcsncpy(temp_logString,logString,tempSize);
    temp_logString[tempSize-1] = NULL;

私はちょうど疑問に思っています、これはうまくいくでしょうか?誰でも欠陥/問題を見ることができますか? このプロジェクトのビルドとテストは少し難しいので、基本的には、すべてを実行する前にサニティ チェックを探しています。または、私がそれを行うためのより良い方法はありますか? 以前にハードコードされた int があったため、size_t 値を _tcsncpy に渡すことはできますか?

助けてくれてありがとう。

4

1 に答える 1

3

sizeof(logString)TCHAR*は、引数として渡されたときに配列がポインターに減衰するときに渡された配列のサイズではなく、a のサイズを返します。

が null で終了していることが保証されている場合はlogString、 を使用してその長さを取得できます_tcslen()。それ以外の場合、 のサイズを知る唯一の方法は、logStringそれを別の引数として関数に渡すことです。

于 2012-04-10T10:45:49.327 に答える