- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我公司的代码中,我们有通用的 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/
在我公司的代码中,我们有通用的 get() 和 set() 方法用于某些组件之间的互操作。但是,如果我尝试运行 PREfast,我会收到大量警告,因为 PREfast 没有意识到 get() 方法会初
我有一个可变函数: print_n_integers(7, 1, 2, 3, 4, 5, 6, 7); int print_n_integers( unsigned int count, ... )
哪个版本的 VS 2010 有原生 c++ 的 PreFast 静态代码分析器?我已经下载了 VS 2010 Ultimate 版试用版,希望它包含所有功能,但在其中找不到内置的 PreFast。我尝
我正在为 windows 7 32 位编写设备驱动程序。我使用的是 WDK 版本 7600.16385.1。到目前为止一切进展顺利,但 prefast 一直告诉我我弄乱了 IRQL 级别。特别是当我尝
在哪里可以找到适用于 Visual Studio 2008 的 Prefast 下载? 我无法通过 Google 或 MSDN 网站找到它。 最佳答案 PREfast 包含在 Windows 驱动程序
我有以下示例代码,想知道我可以使用哪种注释来避免它们。 int Function(classA* pInput) { if (pInput == NULL) { classA::Cr
有什么方法可以启用预快 在 Visual Studio 2008 专业版 添加? 我正在尝试编译 native C++ 代码。 我尝试过以下事情, 已下载的 Windows SDK 将编译器的 Bin
我是一名优秀的程序员,十分优秀!