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


Правило NullCheck (kmdf)

Правило 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;
}

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

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

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

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

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

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