在我公司的代码中,我们有通用的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);
}
是否有任何方法可以对此进行注释,以便PREfast知道
args.data
是由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);
}
最佳答案
这应该可以修正警告。
void foo()
{
int value=0;
...
}
注意
get()
将只在运行时调用由于PREfast是一个静态分析工具,它可能会报告该值未初始化尽管如此,在使用前初始化变量始终是C语言中的最佳实践。另一种方法是使用PREfast
suppress
如下: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);
}
它在suppress语句之后的下一行中抑制警告。
另外,在代码中使用
pragma prefast
之前,请在头文件(或源文件)中添加以下代码:#ifndef _PREFAST_
#pragma warning(disable:4068)
#endif
以避免4068警告被标记注意:pragma prefast只是prefast编译器的扩展,其他编译器可能不支持它。