在我公司的代码中,我们有一般的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);
}
答案 0 :(得分:1)
这应该可以解决警告。
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);
}
它抑制了抑制语句后的下一行中的警告。
此外,请在代码中使用pragma prefast
之前在头文件(或源文件)中添加以下代码:
#ifndef _PREFAST_
#pragma warning(disable:4068)
#endif
避免标记4068警告。注意:pragma prefast仅是PREfast AST编译器的扩展,可能不受其他编译器的支持。