共用方式為


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 規則。

使用下列步驟來執行程式碼的分析:
  1. 準備程式代碼 (使用角色類型宣告) 。
  2. 執行靜態驅動程式驗證程式。
  3. 檢視和分析結果。

如需詳細資訊,請參閱 使用靜態驅動程式驗證器在驅動程式中尋找瑕疵