在我公司的代码中,我们有通用的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);
}发布于 2012-10-19 04:36:01
这应该可以修复警告。
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 AST编译器的一个扩展,其他编译器可能不支持它。
https://stackoverflow.com/questions/11904247
复制相似问题