结构成员的PREfast注释

时间:2012-08-10 14:55:01

标签: c prefast

在我公司的代码中,我们有一般的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);
}

1 个答案:

答案 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编译器的扩展,可能不受其他编译器的支持。