# V1004. Pointer was used unsafely after its check for nullptr.

Анализатор обнаружил потенциальное разыменование нулевого указателя. Сначала этот указатель проверялся на ноль, а потом использовался без проверки.

Пример:

    if (p != nullptr)
    {
      *p = 42;
    }
    ....
    *p += 33;

В случае, если указатель 'p' был равен нулю, в выражении '*p += 33' произойдёт разыменование нулевого указателя. Поэтому нужно добавить проверку:

    if (p != nullptr)
    {
      *p = 42;
    }
    ....
    if (p != nullptr)
    {
      *p += 33;
    }

Либо в этом коде 'p' всегда ненулевой и тогда проверку стоит удалить:

    *p = 42;
    ....
    *p += 33;

Анализатор может выдать ложное срабатывание в следующем случае:

    if (p == nullptr)
    {
      MyExit();
    }
    ....
    *p += 42;

Это происходит, потому что анализатор не может понять, возвращает ли функция 'MyExit' управление или нет. Чтобы подсказать ему эту информацию, следует проаннотировать функцию одним из следующих способов:

- Атрибут C++11: [[noreturn]] void MyExit();
- Атрибут gcc: __attribute__((noreturn)) void MyExit();
- Атрибут MSVC: __declspec((noreturn)) void MyExit();

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки разыменования нулевого указателя/нулевой ссылки [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-119 CWE-476 CWE-628 CERT-EXP08-C CERT-EXP34-C CERT-EXP37-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1004.