Picture 30

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

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


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. Прежде чем перейдем непосредственно к проверке, продемонстрирую возможности плагина. Пройдемся по некоторым пунктам, которые могут вызвать вопросы в духе «а что это вообще такое?».

Picture 13


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

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

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

Picture 14


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


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

Picture 6

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

Picture 10

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

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

Picture 8

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

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

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

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

Picture 1

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

Picture 2

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

Picture 3

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

Picture 11

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

Linux


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

Picture 20

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

Picture 18

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

Picture 16

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

Picture 12

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

Picture 4

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

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

SonarQube


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

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

Picture 9

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

Picture 27

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

Picture 28

Результат :)

Picture 23

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

Picture 25

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

Picture 26

Также строить графики можно при помощи секции 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, а плагин предоставляет удобный графический интерфейс для работы с анализатором.

Picture 40

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

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

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

Picture 42

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

Picture 43

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

Picture 44

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

Для подавления предупреждений анализатора в 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 систему позволяет обнаружить баги сразу после сборки проекта. Это позволяет сократить затраты на поиск и исправление ошибок. Далее приведу ссылки на статьи с интеграциями с самыми популярными облачными сервисами:

  1. PVS-Studio идёт в облака: Travis CI
  2. PVS-Studio идёт в облака: Azure DevOps
  3. PVS-Studio идёт в облака: CircleCI
  4. PVS-Studio идёт в облака: GitLab CI/CD
  5. Запуск PVS-Studio в TeamCity


Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Ekaterina Nikiforova. PVS-Studio 7.07: Features Overview.