nullCheck 规则 (kmdf)

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 规则。

使用以下步骤运行代码分析:
  1. 准备代码 (使用角色类型声明) 。
  2. 运行静态驱动程序验证程序。
  3. 查看和分析结果。

有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷