Compartilhar via


Regra nullCheck (wdm)

A regra NullCheck verifica se um valor NULL dentro do código do driver não é desreferenciado posteriormente no driver. Essa regra relatará um defeito se uma dessas condições for verdadeira:

  • Há uma atribuição de NULL que é desreferenciada posteriormente.
  • Há um parâmetro/global para um procedimento em um driver que pode ser NULL que é desreferenciado posteriormente e há uma marcar explícita no driver que sugere que o valor inicial do ponteiro pode ser NULL.

Com violações da regra NullCheck, as instruções de código mais relevantes são realçadas no painel de árvore de rastreamento. Para obter mais informações sobre como trabalhar com a saída do relatório, consulte Relatório do Verificador de Driver Estático e Noções básicas sobre o Visualizador de Rastreamento.

Exemplo de struct

Este snippet de código mostra o uso adequado de uma estrutura.

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

Este snippet de código mostra o uso inadequado de uma estrutura. O código será compilado, mas produzirá um erro de 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
}

Exemplo de função

Neste exemplo, há um parâmetro para uma função que pode ser NULL, que é desreferenciada posteriormente. Além disso, há uma marcar explícita que sugere que o valor inicial do ponteiro pode ser NULL.

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

Neste exemplo, não há nenhuma violação de regra, pois provavelmente há uma pré-condição implícita de que o parâmetro não seja NULL.

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

Neste segundo exemplo, há uma marcar explícita para NULL, cada vez que o parâmetro é usado.

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

Modelo de driver: WDM

Como testar

Em tempo de compilação

Execute o Verificador de Driver Estático e especifique a regra NullCheck .

Use as seguintes etapas para executar uma análise do código:
  1. Prepare seu código (use declarações de tipo de função).
  2. Execute o Verificador de Driver Estático.
  3. Exiba e analise os resultados.

Para obter mais informações, consulte Usando o Verificador de Driver Estático para localizar defeitos em drivers.