Partager via


Règle NullCheck (kmdf)

La règle NullCheck vérifie qu’une valeur NULL à l’intérieur du code du pilote n’est pas déréférencée ultérieurement dans le pilote. Cette règle signale un défaut si l’une de ces conditions est remplie :

  • Il existe une affectation de NULL qui est déréférencée ultérieurement.
  • Il existe un paramètre/global pour une procédure dans un pilote qui peut être NULL qui sera déréférencé ultérieurement, et il existe un case activée explicite dans le pilote qui suggère que la valeur initiale du pointeur peut être NULL.

Avec les violations de règle NullCheck, les instructions de code les plus pertinentes sont mises en surbrillance dans le volet de l’arborescence de trace. Pour plus d’informations sur l’utilisation de la sortie de rapport, consultez Rapport du vérificateur de pilote statique et Présentation de la visionneuse de trace.

Exemple de struct

Cet extrait de code montre l’utilisation appropriée d’une structure.

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

Cet extrait de code montre l’utilisation incorrecte d’une structure. Le code est compilé, mais génère une erreur d’exécution.

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

Exemple de fonction

Dans cet exemple, il existe un paramètre pour une fonction qui peut être NULL, qui sera déréférencé ultérieurement. En outre, il existe une case activée explicite qui suggère que la valeur initiale du pointeur peut être NULL.

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

Dans cet exemple, il n’y a pas de violation de règle, car il existe probablement une condition préalable implicite au fait que le paramètre n’est pas censé avoir la valeur NULL.

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

Dans ce deuxième exemple, il existe une case activée explicite pour NULL, chaque fois que le paramètre est utilisé.

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

Modèle de pilote : KMDF

Comment tester

Au moment de la compilation

Exécutez Static Driver Verifier et spécifiez la règle NullCheck .

Utilisez les étapes suivantes pour exécuter l’analyse de votre code :
  1. Préparez votre code (utilisez les déclarations de type).
  2. Exécutez le vérificateur de pilote statique.
  3. Affichez et analysez les résultats.

Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes.