Поделиться через


Правило NullCheck (wdm)

Правило NullCheck проверяет, что значение NULL в коде драйвера не разыменовывается позже в драйвере. Это правило сообщает о дефекте, если выполняется одно из следующих условий:

  • Существует назначение NULL, которое разыменовывается позже.
  • Существует глобальный параметр или параметр процедуры в драйвере, который может иметь значение NULL, который позже разыменовывается, и в драйвере есть явное проверка, предполагающее, что начальное значение указателя может иметь значение NULL.

При нарушениях правил NullCheck наиболее релевантные операторы кода выделяются в области дерева трассировки. Дополнительные сведения о работе с выходными данными отчета см. в разделах Отчет о средстве проверки статических драйверов и Основные сведения о средстве просмотра трассировки.

Пример структуры

В этом фрагменте кода показано правильное использование структуры.

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

В этом фрагменте кода показано неправильное использование структуры. Код будет компилирован, но приведет к ошибке среды выполнения.

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

Пример функции

В этом примере имеется параметр для функции, который может иметь значение NULL, который будет разыменовыв позже. Кроме того, существует явное проверка, предполагающее, что начальное значение указателя может иметь значение NULL.

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

В этом примере нарушение правила отсутствует, так как, скорее всего, существует неявное условие, что параметр не должен иметь значение NULL.

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

Во втором примере при каждом использовании параметра имеется явное проверка null.

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

Модель драйвера: WDM

Как тестировать

Во время компиляции

Запустите средство проверки статических драйверов и укажите правило NullCheck .

Чтобы выполнить анализ кода, выполните следующие действия.
  1. Подготовьте код (используйте объявления типов ролей).
  2. Запустите средство проверки статических драйверов.
  3. Просмотр и анализ результатов.

Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах.