Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Пояснение про диагностику V595

Пояснение про диагностику V595

26 Окт 2015

В анализаторе PVS-Studio существует диагностика V595 "The pointer was utilized before it was verified against nullptr". Я получаю много вопросов от наших пользователей, которые касаются как раз этой диагностики. Поэтому я решил заранее подготовить обстоятельный ответ, который поможет мне в дальнейшем объяснять, как работает эта диагностика.

Описание диагностики V595 в документации: The pointer was utilized before it was verified against nullptr.

Примечание. С момента написания статьи в 2015 году многое изменилось, и диагностика V595 стала более интеллектуальной. Теперь анализатор умеет заглядывать в тела функций, в том числе расположенных в разных файлах. Благодаря этому могут быть обнаружены более сложные варианты ошибок. См. раздел "Технология статического анализа кода PVS-Studio".

Типовой вопрос, касающийся V595, звучит следующим образом:

У меня есть код следующего вида:

void MyClass::Do()
{
  m_ptr->Foo(1, 2, 3);
  Process(1, 2, 3, 4, 5);
}

Член класса 'm_ptr' иногда может принимать нулевые значения. В результате, происходит падание программы. Я ожидал, что анализатор PVS-Studio выдаст предупреждение, что указатель 'm_ptr' следует проверить перед использование. Я хочу увидеть предупреждение V595, а его нет. Прошу пояснить эту ситуацию.

Постараюсь дать подробный ответ.

Анализатор PVS-Studio в общем случае не диагностирует ситуацию, что указатель может быть нулевой и перед использованием его следует проверить.

Если сделать "тупую" диагностику, которая будет говорить, что указатель используется без проверки, то этой диагностикой будет невозможно пользоваться. Будет такое невероятное количество ложных срабатываний, что даже если и будет найдена ошибка, она потонет в ложных предупреждениях и её никто не найдёт. Поэтому такой вариант диагностики реализовывать нет смысла.

Идеологически правильно пытаться понять, может ли указатель принимать нулевое значение. Это невероятно сложная техническая задача. Нужно анализировать call graph и пытаться понять возможные значения переменных. На практике, это невозможно. Различные анализаторы, и PVS-Studio в их числе, пытаются частично решать эту задачу для простых случаев. Но в целом все равно получается плохо. Многие ошибки не будут замечены, многие пропущены.

Например, анализатор PVS-Studio может найти такую ошибку только для простых случаев. Пример:

void Foo(int *p)
{
  if (!p)
  {
    p[1] = 2; //V522
  }
}

Анализатор видит, что мы входим в тело if, если указатель равен 0. Значит разыменование указателя приведёт к ошибке. Это очень простой пример. В сложных вариантах, например, как в первом примере, анализатор бессилен. Он не может вычислить, что лежит в 'm_ptr' в данный момент.

Поскольку, как мы видим анализатор, слаб в решении подобных задач напрямую, существуют обходные пути поиска ошибок. Одним из таких обходных способов является диагностика V595. Принцип её работы: надо выдавать предупреждение, если указатель в начале разыменовывается, а потом проверяется.

Поясню на примере. Здесь PVS-Studio не знает, что будет в 'p' и поэтому ему нечего сказать:

void Foo()
{
  int *p = Get();
  p[0] = 1;
  ....
}

Однако в один из моментов, программист вспомнил, что указатель может быть равен нулю и ниже имеется проверка указателя. Т.е. мы имеем вот такой код:

void Foo()
{
  int *p = Get();
  p[0] = 1; // V595
  ....
  if (p == NULL)
    Zzz();
}

PVS-Studio выдаёт предупреждение V595. Анализатор не способен вычислить, что вернёт функция Get(). Но ему это и не нужно. Он видит, что ниже указатель проверятся на равенство нулю. Это значит, что возможны ситуации, когда указатель нулевой. И разыменовывать его без проверки нельзя.

Надеюсь я пояснил как работает анализатор и почему анализатор не выдаёт предупреждение для кода показанного в самом начале. Ниже нет проверки, что переменная 'm_ptr' равна 0, поэтому нет и предупреждения. К сожалению, анализатор здесь бессилен.

Популярные статьи по теме
Holy C++

Дата: 23 Ноя 2022

Автор: Гость

В этой статье постараюсь затронуть все вещи, которые можно без зазрения совести выкинуть из С++, не потеряв ничего (кроме боли), уменьшить стандарт, нагрузку на создателей компиляторов, студентов, из…
Продление жизни временных значений в С++: рецепты и подводные камни

Дата: 01 Ноя 2022

Автор: Гость

Прочитав эту статью, вы узнаете следующее: способы, которыми можно продлить время жизни временного объекта в С++; рекомендации и подводные камни этого механизма, с которыми может столкнуться С++ прог…
Как мы баг в PVS-Studio искали или 278 Гигабайтов логов

Дата: 28 Окт 2022

Автор: Григорий Семенчев, Сергей Ларин, Филипп Хандельянц

Предлагаем вашему вниманию интересную историю о поиске бага внутри анализатора PVS-Studio. Да, мы тоже допускаем ошибки, но мы готовы засучить рукава и залезть в самую глубину "кроличьей норы".
0, 1, 2, Фредди забрал Blender

Дата: 26 Окт 2022

Автор: Андрей Карпов

Эта статья могла бы получить название "Как PVS-Studio защищает от поспешных правок кода, пример N7". Однако так именовать статьи становится скучновато. Поэтому сейчас вы узнаете, причём здесь Фредди …
Примеры ошибок, которые может обнаружить PVS-Studio в коде LLVM 15.0

Дата: 25 Окт 2022

Автор: Андрей Карпов

Компиляторы развиваются и выдают всё больше предупреждений. Остаются ли преимущества от использования статических анализаторов кода, таких как PVS-Studio? Да, так как анализаторы тоже развиваются. Пе…

Комментарии (0)

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо