Правило 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 . Чтобы выполнить анализ кода, выполните следующие действия.
Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах. |