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