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 規則。 使用下列步驟來執行程式碼的分析:如需詳細資訊,請參閱 使用靜態驅動程式驗證器在驅動程式中尋找瑕疵。 |