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;
}
驱动程序模型:KMDF
如何测试
| 编译时 | 
|---|
| 运行 静态驱动程序验证程序 并指定 NullCheck 规则。使用以下步骤运行代码分析: 有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷。 |