Обзор возможностей PVS-Studio версии 7.07



Цель этой статьи – обзорная демонстрация возможностей статического анализатора PVS-Studio. Самый простой и наглядный способ это сделать – показать работу инструмента на примерах. Будет показана проверка проекта при помощи плагина для Visual Studio, запуск анализатора в операционной системе Linux, импорт результатов анализа в SonarQube.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image1.png

Общая информация

PVS-Studio - это статический анализатор кода, написанного на языках С, C++, C# и Java. PVS-Studio выполняет широкий спектр проверок кода, но наиболее силён в поисках опечаток и последствий неудачного Copy-Paste (примеры: раз, два, три, четыре). Статический анализ служит хорошим дополнением к одному из самых старых и надежных методов выявления дефектов - code review. Некоторые ошибки тяжело находятся во время совместного обзора кода (к примеру, те же самые опечатки). Например:

int trans_rest(transcoder_settings *trans)
{
  ....
  for(i=0; i<16; i++);
  {
    trans->eq.eq.preamp[i]   = 0.0;
    for(j=0; j<32; j++)
    {
      trans->eq.eq.boost[i][j] = 0.0;
    }
  }
}

Для тех, кто не заметил, обратите внимание на точку с запятой после первого for. Или:

private class ObjectArrayComparer : IEqualityComparer<object[]>
{
  public bool Equals(object[] x, object[] y)
  {
    ....
    for (int i = 0; i < x.Length; i++)
    {
      if (!object.Equals(x[0], y[0])) 
      {
        return false;
      }
    }
    return true;
  }
  ....
}

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

Плагин для Visual Studio

PVS-Studio имеет плагин для Visual Studio 2010-2019. Прежде чем перейдем непосредственно к проверке, продемонстрирую возможности плагина. Пройдемся по некоторым пунктам, которые могут вызвать вопросы в духе "а что это вообще такое?".

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image2.png

Обращу внимание на пункт Suppress Messages, открывающий окно для работы с подавленными предупреждениями анализатора и сейчас объясню, что же это за пункт. Дело в том, что PVS-Studio умеет подавлять предупреждения, что позволяет легко начать использовать анализатор даже в большом проекте. Это позволяет легко и быстро внедрить статический анализатор в процесс разработки.

Если ваш проект небольшой, то внедрить анализатор будет довольно просто. Однако, если проект "с историей", то у вас, наверное, закрались сомнения: кто будет заниматься обработкой и фильтрацией результатов, сколько времени нужно этому посвятить и т.д. Попробую их развеять.

Идеальный вариант использования анализатора в этом случае следующий. Вы запускаете его на своем проекте и видите кучу сообщений анализатора. Далее при помощи механизма подавления предупреждений указываете PVS-Studio не показывать эти сообщения. Т.к. ваш проект развивается уже давно, то в отчете анализатора почти наверняка будет мало предупреждений, связанных с какими-то критическими дефектами. Далее, в процессе разработки вы и ваши коллеги видят только те ошибки, которые относятся к измененному или новому коду. Те предупреждения, которые были подавлены, теперь являются вашим техническим долгом, к которому можно возвращаться постепенно. Подробнее механизм подавления предупреждений описан тут.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image3.png

Далее перейдем к пункту "Display CWE Codes in Output Window". PVS-Studio является средством статического тестирования защищённости приложений (Static Application Security Testing, SAST). Предупреждения PVS-Studio можно классифицировать согласно Common Weakness Enumeration (CWE). Чтобы узнать о классификации предупреждений PVS-Studio согласно CWE, зачем нужно CWE, что это такое и так далее, предлагаю ознакомиться со следующими ссылками:

Перейдём к вкладке "Options".

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image4.png

В разделе "Detectable Errors (C, C++)" мы можем управлять отображением типов сообщений анализатора. Те диагностические сообщения, которые по какой-то причине не актуальны для данного проекта, можно скрыть или отключить. Например, MISRA диагностики вряд ли заинтересуют кого-то, помимо embedded-разработчиков. Поэтому они отключены по умолчанию. Пользователя, который впервые решил воспользоваться анализатором, количество MISRA предупреждений может отпугнуть и ввести в ступор. А та часть пользователей, которые целенаправленно запустили анализатор, чтобы проверить свой проект на соответствие стандартам MISRA, могут просто включить их в настройках.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image6.png

Тут можно ввести пути/маски для исключения некоторых файлов или папок из анализа. На выбор можно указать или маски по путям (Path Mask) или маски по именам файлов (FileName Mask). Они нужны, если требуется исключить из анализа сторонние библиотеки, автоматически сгенерированные файлы и т.п. После задания масок исключений, сообщения из соответствующих им файлов исчезнут из окна вывода PVS-Studio, а в следующую проверку они включены уже не будут. Таким образом, исключение файлов и директорий посредством масок может позволить существенно сократить общее время анализа всего проекта.

Подробнее тут.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image8.png

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

Примечание. В PVS-Studio есть и другие способы разметки ложных предупреждений в коде или макросах. Они описаны в документации в разделе "Подавление ложных предупреждений".

После того, как мы закончили с обзором настроек, перейдём к проверке проекта. Как вы возможно заметили, в статье было несколько настроек, связанных с C++ проектами, а специфичных для C# и Java не было. Просто настроек по С++ больше, чем для C#, поэтому мы решили остановиться в этом кратком обзоре именно на них. Но для разнообразия повествования давайте проверим с помощью плагина к Visual Studio не C++, а C# проект и посмотрим, как выглядит отчёт анализатора.

Естественно, после первой проверки проекта вам придётся вернуться к настройкам, чтобы уменьшить процент ложных срабатываний. Ложные срабатывания неизбежны, но их процент можно уменьшить с помощью настройки до приемлемого значения. См. статью: "Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний".

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image10.png

Выбираем пункт "Analyze Solution with PVS-Studio".

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image11.png

Появится окно с прогресс баром.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image12.png

А далее мы сможем посмотреть отчет анализатора.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image14.png

К слову, тут тоже можно отфильтровать некоторые предупреждения. Например, можно скрыть первое предупреждение в нашем отчете, выбрав его и нажав пункт "Mark selected messages as False Alarms". За подробностями вновь отсылаем к разделу руководства "Подавление ложных предупреждений".

Linux

Ранее мы проверяли C# проект. Теперь попробуем проверить код, написанный на C++. Чтобы внести разнообразие в статью, проверим мы его под Linux. К слову, под Windows, Linux и macOS можно проверять проекты на любом языке (C, C++, C#, Java).

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image16.png

Клонируем репозиторий.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image18.png

Запускаем конфигурационный скрипт для сборки.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image20.png

Запускаем PVS-Studio в режиме трассировки и собираем проект. Необходима установленная утилита strace. Вместо команды make в вашем случае может быть любая команда запуска сборки проекта со всеми необходимыми параметрами.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image22.png

Анализируем файлы из проекта, используя результаты предыдущего шага. Ключ -a позволяет указать, какие именно предупреждения должны попасть в отчет.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image24.png

Конвертируем лог в html и наслаждаемся результатами.

Я описала лишь один вариант проверки проекта под Linux и весьма формально, не углубляясь в подробности. Есть и другие способы проверить проект, например, прописав вызов анализатора в makefile. Для более подробного ознакомления рекомендую обраться к следующими ссылкам:

SonarQube

SonarQube — платформа с открытым исходным кодом для непрерывного анализа и измерения качества кода, поддерживающая большое количество языков программирования и позволяющая получать отчеты по таким метрикам, как дублирование кода, соответствие стандартам кодирования, покрытие тестами, сложность кода, потенциальные ошибки и т.д.

PVS-Studio имеет плагин для импорта результатов анализа в SonarQube, попробуем воспользоваться им.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image26.png

Для начала получим отчёт анализатора и конфигурационный файл sonar-project.properties.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image28.png

Далее нам нужна команда запуска сканера.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image30.png

Результат :)

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image32.png

Также конфигурационный файл можно создать (или отредактировать). Например, на скрине выше мы включили добавление идентификатора MISRA к предупреждениям анализатора. Да, то есть по умолчанию MISRA отключена и тут. Если вам нужно проверить свой код на соответствие MISRA, то добавьте "active" в свой конфигурационный файл для включения.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image33.png

Во вкладке Measures доступны различные метрики кода и графики.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image35.png

Также строить графики можно при помощи секции PVS-Studio. Подробнее об интеграции результатов анализа PVS-Studio в SonarQube можно узнать в этом разделе руководства.

PVS-Studio Java

Мы сейчас посмотрели настройки для C++ проектов, проверили проект на C#, однако Java как-то выпала из статьи. Надо это исправить и рассказать, что из себя представляет анализатор PVS-Studio Java. Анализатор имеет несколько различных способов интеграции в проект. В зависимости от сборочной системы, вы можете воспользоваться плагином для Maven или Gradle. Так же вы можете использовать напрямую ядро анализатора. Использование плагинов Gradle, Maven или ядра напрямую позволяет с легкостью работать с Sonar Qube или CI (Jenkins). Если у вас включены эти плагины, то Java проект проверяется статическим анализом прямо в процессе сборки и в итоге вы получите не только свой собранный проект, но еще и лог от анализатора PVS-Studio.

Анализатор PVS-Studio Java можно также использовать в виде плагина к IntelliJ IDEA. В таком случае разбор структуры проекта производится средствами этой IDE, а плагин предоставляет удобный графический интерфейс для работы с анализатором.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image36.png

Подробнее предлагаю прочитать в разделе руководства "Как запустить PVS-Studio Java".

Так же, проверяя Java проект можно подавлять сообщения анализатора, чтобы интеграция в большой проект была быстрой и безболезненной.

В IntelliJ IDEA это выглядит следующим образом.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image38.png

В этом окошке мы видим отчет анализатора.

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image40.png

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

https://import.viva64.com/docx/blog/0734_PVS_Studio_707_overview_ru/image41.png

Также мы можем подавить все сообщения анализатора.

Для подавления предупреждений анализатора в Gradle необходимо выполнять команду:

./gradlew pvsSuppress "-Ppvsstudio.report=/path/to/report.json"
  "-Ppvsstudio.output=/path/to/suppress_base.json"

Для подавления предупреждений анализатора в Maven необходимо выполнять команду:

mvn pvsstudio:pvsSuppress "-Dpvsstudio.report=/path/to/report.json"
  "-Dpvsstudio.output=/path/to/suppress_base.json"

Подробнее о механизме подавления предупреждений тут.

Подведем итоги

Целью этой статьи было показать возможности статического анализатора PVS-Studio, как просто с ним работать при помощи плагина для Visual Studio и под Linux. Благодаря возможности интеграции с платформой SonarQube, можно обеспечить непрерывный анализ и управление качеством вашего кода, что является только лишь одной из множества возможностей, описанных в документации.

Интеграция статического анализатора в CI систему позволяет обнаружить баги сразу после сборки проекта. Это позволяет сократить затраты на поиск и исправление ошибок. Далее приведу ссылки на статьи с интеграциями с самыми популярными облачными сервисами:


Вы можете обсудить эту статью с другими читателями на сайте habr.com


Найдите ошибки в своем C, C++, C# и Java коде

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

goto PVS-Studio;



Найденные ошибки

Проверено проектов
386
Собрано ошибок
13 991

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

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