在我公司的代码中,我们有通用的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语言中的最佳实践。
另一种方法是使用PREfastsuppress如下:
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编译器的扩展,其他编译器可能不支持它。

08-19 18:49