2

私の会社のコードには、特定のコンポーネント間の相互運用のための一般的な get() および set() メソッドがあります。しかし、PREfast を実行しようとすると、大量の警告が表示されます。これは、PREfast が get() メソッドが指定されたパラメーターを初期化することを認識していないためです。

問題は、これらのメソッドは非常に一般的であるため、単純にパラメーターを取るのではなく (_Out_または同様にマークすることができますが、どのデータを返す必要があるかに関するデータを保持する構造体の配列を取ることです。

コード内 (大幅に簡略化):

typedef struct
{
    int type;
    int* data;
} ARGS;

void get(int count, ARGS* args)
{
    for (int i = 0; i < count; i++)
        *(args[i].data) = 42; // Actually handled by internal methods
}

// Sample Usage
void foo()
{
    int value;
    ARGS args[1];

    args[0].type = 1234;
    args[0].data = &value;

    get(1, args);

    // Do something with value
    // PREfast complains that value is uninitialized (error C6001)
    printf("%d", value);
}

args.dataによって初期化されていることを PREfast が認識できるように、これに注釈を付ける方法はありますget()か? それとも、これは複雑すぎて PREfast で処理できないのでしょうか?

編集: を使用するget(1, &args)と、警告が消えます。したがって、このケースを処理できる PREfast にはいくつかのヒューリスティックがありますが、外部からトリガーできるかどうかはわかりません。

void get2(int count, ARGS(* args)[1]) // Needs the size of args, or it won't compile below
{
    for (int i = 0; i < count; i++)
        *(*args)[i].data = 42; // Actually handled by internal methods
}

// Sample Usage
void foo2()
{
    int value;
    ARGS args[1];

    args[0].type = 1234;
    args[0].data = &value;

    get2(1, &args);

    // Do something with value
    printf("%d", value);
}
4

1 に答える 1

1

This should fix the warning.

void foo()
{
   int value=0;
  ...
}

Note that get() will be called in runtime only. Since, PREfast is a static analysis tool, it might report that the value is uninitialized. Nevertheless, initializing a variable before use is always a best practice in C.

Another way would be to use the PREfast suppress as below:

void foo()
{
    int value;
    ARGS args[1];

    args[0].type = 1234;
    args[0].data = &value;

    get(1, args);

    // Do something with value
    // PREfast complains that value is uninitialized (error C6001)
    #pragma prefast(suppress:C6001 , "PREfast noise: the variable value will be initialized by get method in a line above")
    printf("%d", value);
}

It suppresses the warnings in the next line after the suppress statement.

Also, do add the following code in you header files(or source files) just before using the pragma prefast in your code:

#ifndef _PREFAST_
#pragma warning(disable:4068)
#endif

to avoid 4068 warning to be flagged. NOTE: pragma prefast is an extension to the PREfast AST compiler only and may not be supported by other compilers.

于 2012-10-18T20:36:01.087 に答える