gpt4 book ai didi

c - 结构成员的 PREfast 注释

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:17 26 4
gpt4 key购买 nike

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

它抑制抑制语句后下一行中的警告。

此外,在您的代码中使用 pragma prefast 之前,请务必在您的头文件(或源文件)中添加以下代码:

#ifndef _PREFAST_
#pragma warning(disable:4068)
#endif

避免标记 4068 警告。注意:pragma prefast 只是对 PREfast AST 编译器的扩展,其他编译器可能不支持。

关于c - 结构成员的 PREfast 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11904247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com