Condividi tramite


Regola NullCheck (kmdf)

La regola NullCheck verifica che un valore NULL all'interno del codice driver non venga dereferenziato più avanti nel driver. Questa regola segnala un difetto se una di queste condizioni è vera:

  • È presente un'assegnazione di NULL che viene dereferenziata in un secondo momento.
  • È presente un parametro globale/parametro per una routine in un driver che può essere NULL che viene dereferenziato in un secondo momento ed è presente un controllo esplicito nel driver che suggerisce che il valore iniziale del puntatore può essere NULL.

Con le violazioni delle regole NullCheck, le istruzioni di codice più rilevanti vengono evidenziate nel riquadro dell'albero di traccia. Per altre informazioni sull'utilizzo dell'output del report, vedere Static Driver Verifier Report e Understanding the Trace Viewer.

Esempio di struct

Questo frammento di codice mostra l'uso corretto di una struttura.

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

Questo frammento di codice mostra l'uso improprio di una struttura. Il codice verrà compilato, ma genererà un errore di runtime.

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

Esempio di funzione

In questo esempio è presente un parametro per una funzione che può essere NULL, che viene dereferenziata in un secondo momento. Inoltre, esiste un controllo esplicito che suggerisce che il valore iniziale del puntatore può essere NULL.

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

In questo esempio non esiste alcuna violazione della regola perché è probabile che sia prevista una precondizione implicita che il parametro non sia NULL.

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

In questo secondo esempio è presente un controllo esplicito per NULL, ogni volta che viene usato il parametro .

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

Modello di driver: KMDF

Come eseguire il test

In fase di compilazione

Eseguire Static Driver Verifier e specificare la regola NullCheck .

Usa i passaggi descritti di seguito per eseguire un'analisi del codice:
  1. Prepara il codice (usa dichiarazioni di tipo ruolo).
  2. Esegui Driver Verifier statico.
  3. Visualizza e analizza i risultati.

Per altre informazioni, vedere Using Static Driver Verifier to Find Defects in Drivers.For more information, see Using Static Driver Verifier to Find Defects in Drivers.