nullCheck 规则 (wdm)
NullCheck 规则验证驱动程序代码中的 NULL 值稍后不会在驱动程序中取消引用。 如果满足以下任一条件,则此规则将报告缺陷:
- 有一个分配 NULL,稍后将取消引用。
- 驱动程序中的过程有一个全局/参数,该参数可能为 NULL,稍后将取消引用,并且驱动程序中有一个显式检查,指示指针的初始值可能为 NULL。
如果出现 NullCheck 规则冲突,跟踪树窗格中将突出显示最相关的代码语句。 有关使用报表输出的详细信息,请参阅 静态驱动程序验证程序报告 和 了解跟踪查看器。
结构示例
此代码片段演示如何正确使用 结构。
//Rule does not fail
typedef struct _B {
int *f;
} B;
void GoodStruc(B *x) {
B *y = x;
y->f = NULL; //assign NULL
if (x->f) {
*(x->f) = 1;
} //OK
}
此代码片段显示结构的不当使用。 代码将编译,但将生成运行时错误。
//Rule fails
typedef struct _A {
int *f;
} A;
void BadStruc(A *x) {
A *y = x;
y->f = NULL; //assign NULL
*(x->f) = 1; //dereferencing NULL
}
函数示例
在此示例中,函数有一个参数,该参数可能为 NULL,稍后将取消引用。 此外,还有一个显式检查,指示指针的初始值可能为 NULL。
//Rule fails
void Bad(int *x)
{
*x = 2; //Possibly dereferencing NULL
if (x != NULL) //checks for null on a parameter
*x = *x + 1;
}
在此示例中,不存在任何规则冲突,因为可能有一个隐式前提条件,即参数不应为 NULL。
//Rule does not fail
void Good1(int *x)
{
*x = 2;
*x = *x + 1;
}
在此第二个示例中,每次使用 参数时,都有一个 NULL 的显式检查。
//Rule does not fail
void Good2(int *x)
{
if (x != NULL)
*x = 2; // ok
if (x != NULL) //checks for null on a parameter
*x = *x + 1;
}
驱动程序模型:WDM
如何测试
编译时 |
---|
运行 静态驱动程序验证程序 并指定 NullCheck 规则。 使用以下步骤运行代码分析:有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷。 |