>
>
>
V1004. Pointer was used unsafely after …


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 как критические и относятся к типу: Ошибки разыменования нулевого указателя.

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

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