私の会社のコードには、特定のコンポーネント間の相互運用のための一般的な 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);
}