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

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

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

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


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

>
>
>
Анализатор PVS-Studio на сайте godbolt.…

Анализатор PVS-Studio на сайте godbolt.org (Compiler Explorer) и предостережение

8 июня 2020 г.

Мы добавили возможность экспериментировать со статическим анализатором кода PVS-Studio на сайте godbolt.org (Compiler Explorer). Поддерживается анализ C и C++ кода. Уверены, что это интересный и очень простой способ попробовать, как поведёт себя анализатор на тех или иных примерах кода. Однако у нас есть опасение, что теперь программисты начнут пытаться оценивать возможности анализатора на синтетических примерах, а не запуская на реальных проектах. Давайте попробуем разобраться, чем плох подход оценки, базирующийся на синтетических примерах.

0739_godbolt_and_caution_ru/image1.png

Compiler Explorer это интерактивный инструмент, который позволяет печатать код в одном окне и видеть результаты его компиляции в другом.

PVS-Studio – это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C++, C# и Java.

Мы подружили эти два инструмента, и теперь можно быстро попробовать, обнаружится ли та или иная ошибка в коде с помощью PVS-Studio. Для этого достаточно:

  • Зайти на сайт godbolt.org,
  • Во вкладке с выводом компилятора нажать "Add tool...",
  • В выпадающем списке выбрать "PVS-Studio".

Теперь вы можете проверять ваш код, просто вписав его в окне на сайте. На данный момент поддерживаются все версии компиляторов GCC и Clang для платформ x86 и x64.

Эта новая возможность открывает интересные перспективы с точки зрения утоления любопытства, написания статей и так далее. Однако в этом есть опасность: синтетические примеры могут быть использованы не только для экспериментов/изучения, но и для попытки оценивать и сравнивать анализаторы кода. А это очень плохой подход. Он будет слишком неточен и зависеть от того, как написан пример кода.

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

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

int main()
{
  int *p = new int;
  *p = 1;
  return 1;
}

Да, PVS-Studio умеет выявлять утечки памяти. Вот только здесь он промолчит.

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

Да, формально это всё равно ошибка. Но на практике такой код так широко распространён, что нет смысла отвлекать людей подобными срабатываниями. И помнится, кто-то из пользователей тоже просил нас убрать предупреждения про утечки для main.

Стоит поменять название функции и предупреждение вернётся.

int foo()
{
  int *p = new int;
  *p = 1;
  return 1;
}

Теперь анализатор выдаст ожидаемое предупреждение: <source>:5:1: error: V773 The function was exited without releasing the 'p' pointer. A memory leak is possible.

Другой пример с функцией main. Давайте сделаем в ней вечный цикл:

int main()
{
  unsigned i = 0;
  while (1)
  {
      i++;
  }
  return 1;
}

Анализатор молчит. Неужели он не видит подозрительный вечный цикл? Видит. И это тоже распространённый паттерн корректного кода. Так очень часто пишут разработчики программ для микроконтроллеров. Почти всегда в таких программах есть вечный цикл, в котором что-то делается. Выход из функции main не имеет смысла и никогда не осуществляется. Там, собственно, и выходить-то некуда :).

И вновь, стоит поменять название функции, и анализатор выдаст предупреждение.

int foo()
{
  unsigned i = 0;
  while (1)
  {
      i++;
  }
  return 1;
}

Анализатор сообщает: <source>:4:1: note: V776 Potentially infinite loop.

Работа любого статического анализатора – это хрупкий баланс между бесконечным количеством малополезных сообщений и опасностью не сообщить про настоящую ошибку. Теперь становится понятно, почему анализаторы кода столь чувствительны к тому, как составлены примеры. И надо быть очень аккуратным при написании синтетических примеров. И вдвойне надо быть аккуратным, если с помощью таких маленьких тестов вы захотите сравнивать инструменты анализа. Лучше так не делать.

Если кто-то хочет лучше понять нашу философию реализации диагностик и отсечения ложных срабатываний, предлагаю взглянуть на две следующие статьи:

Самый лучший способ попробовать анализатор кода и оценить его возможности – это запустить его на своем настоящем проекте. Это легко сделать. Просто скачайте анализатор PVS-Studio запустите. Кстати, а для открытых проектов есть ещё и бесплатная лицензия.

Теперь вы предупреждены. Пробуйте, экспериментируйте. Но будьте аккуратны в выводах.

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

Спасибо за внимание.

Популярные статьи по теме
PVS-Studio для Java

Дата: 17.01.2019

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

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22.12.2018

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

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21.11.2018

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

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31.07.2017

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

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
Зло живёт в функциях сравнения

Дата: 19.05.2017

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

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Главный вопрос программирования, рефакторинга и всего такого

Дата: 14.04.2016

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

Вы угадали, ответ - "42". Здесь приводится 42 рекомендации по программированию, которые помогут избежать множества ошибок, сэкономить время и нервы. Автором рекомендаций выступает Андрей Карпов - тех…
Как PVS-Studio оказался внимательнее, чем три с половиной программиста

Дата: 22.10.2018

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

PVS-Studio, как и другие статические анализаторы кода, часто выдаёт ложные срабатывания. Но не стоит спешить считать странные срабатывания ложными. Это короткая история о том, как PVS-Studio вновь ок…
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27.06.2017

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

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

Дата: 20.03.2017

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

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…
Эффект последней строки

Дата: 31.05.2014

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

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …

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

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять