Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Правило 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 . Чтобы выполнить анализ кода, выполните следующие действия.
Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах. |