NullCheck-Regel (wdm)

Die NullCheck-Regel überprüft, ob ein NULL-Wert im Treibercode später im Treiber nicht dereferenziert wird. Diese Regel meldet einen Fehler, wenn eine der folgenden Bedingungen zutrifft:

  • Es gibt eine Zuweisung von NULL, die später dereferenziert wird.
  • Es gibt einen globalen/Parameter für eine Prozedur in einem Treiber, die später null sein kann, und es gibt eine explizite Überprüfung im Treiber, die darauf hindeutet, dass der Anfangswert des Zeigers NULL sein kann.

Bei Verstößen gegen nullCheck-Regeln werden die relevantesten Codeanweisungen im Bereich der Ablaufverfolgungsstruktur hervorgehoben. Weitere Informationen zum Arbeiten mit der Berichtsausgabe finden Sie unter Static Driver Verifier Report und Grundlegendes zum Ablaufverfolgungs-Viewer.

Strukturbeispiel

Dieser Codeausschnitt zeigt die ordnungsgemäße Verwendung einer Struktur.

//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
    
}

Dieser Codeausschnitt zeigt die unsachgemäße Verwendung einer Struktur. Der Code wird kompiliert, erzeugt aber einen Laufzeitfehler.

//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
}

Funktionsbeispiel

In diesem Beispiel gibt es einen Parameter für eine Funktion, die NULL sein kann und später dereferenziert wird. Darüber hinaus gibt es eine explizite Überprüfung, die darauf hindeutet, dass der Anfangswert des Zeigers NULL sein kann.

//Rule fails
void Bad(int *x)
{
    *x = 2; //Possibly dereferencing NULL
    if (x != NULL) //checks for null on a parameter
        *x = *x + 1;
}

In diesem Beispiel gibt es keinen Regelverstoß, da es wahrscheinlich eine implizite Voraussetzung dafür gibt, dass der Parameter nicht NULL ist.

//Rule does not fail
void Good1(int *x)
{
     *x = 2;
     *x = *x + 1;
}

In diesem zweiten Beispiel wird bei jeder Verwendung des Parameters eine explizite Überprüfung auf NULL ausgeführt.

//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;
}

Treibermodell: WDM

So führen Sie einen Test durch

Beim Kompilieren:

Führen Sie static Driver Verifier aus, und geben Sie die NullCheck-Regel an.

Gehen Sie folgendermaßen vor, um Ihren Code zu analysieren:
  1. Bereiten Sie den Code vor (verwenden Sie Rollentypdeklarationen).
  2. Führen Sie Static Driver Verifier aus.
  3. Überprüfen und analysieren Sie die Ergebnisse.

Weitere Informationen finden Sie unter Verwenden der statischen Treiberüberprüfung, um Fehler in Treibern zu finden.