Freigeben über


NullCheck-Regel (kmdf)

Die NullCheck-Regel überprüft, ob ein NULL-Wert im Treibercode später im Treiber nicht abgeleitet 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 möglicherweise NULL ist, die später abgeleitet wird, und es gibt eine explizite Überprüfung im Treiber, die darauf hindeutet, dass der Anfangswert des Zeigers NULL sein kann.

Bei NullCheck-Regelverletzungen werden die relevantesten Codeanweisungen im Ablaufverfolgungsstrukturbereich 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, die später abgeleitet 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 liegt keine Regelverletzung vor, da wahrscheinlich eine implizite Voraussetzung dafür besteht, dass der Parameter nicht AUF NULL festgelegt wird.

//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: KMDF

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.