NullCheck ルール (storport)
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;
}
この 2 番目の例では、パラメーターが使用されるたびに、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;
}
ドライバー モデル: Storport
テスト方法
コンパイル時 |
---|
静的ドライバー検証ツールを実行し、NullCheck ルールを指定します。 コードの分析を実行するには、次の手順に従います。詳細については、「静的ドライバー検証ツールを使用してドライバー の欠陥を見つける」を参照してください。 |