Цель этой статьи – обзорная демонстрация возможностей статического анализатора 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. Прежде чем перейдем непосредственно к проверке, продемонстрирую возможности плагина. Пройдемся по некоторым пунктам, которые могут вызвать вопросы в духе «а что это вообще такое?».
Обращу внимание на пункт Suppress Messages, открывающий окно для работы с подавленными предупреждениями анализатора и сейчас объясню, что же это за пункт. Дело в том, что PVS-Studio умеет подавлять предупреждения, что позволяет легко начать использовать анализатор даже в большом проекте. Это позволяет легко и быстро внедрить статический анализатор в процесс разработки.
Если ваш проект небольшой, то внедрить анализатор будет довольно просто. Однако, если проект «с историей», то у вас, наверное, закрались сомнения: кто будет заниматься обработкой и фильтрацией результатов, сколько времени нужно этому посвятить и т.д. Попробую их развеять.
Идеальный вариант использования анализатора в этом случае следующий. Вы запускаете его на своем проекте и видите кучу сообщений анализатора. Далее при помощи механизма подавления предупреждений указываете PVS-Studio не показывать эти сообщения. Т.к. ваш проект развивается уже давно, то в отчете анализатора почти наверняка будет мало предупреждений, связанных с какими-то критическими дефектами. Далее, в процессе разработки вы и ваши коллеги видят только те ошибки, которые относятся к измененному или новому коду. Те предупреждения, которые были подавлены, теперь являются вашим техническим долгом, к которому можно возвращаться постепенно. Подробнее механизм подавления предупреждений описан тут.
Далее перейдем к пункту «Display CWE Codes in Output Window». PVS-Studio является средством статического тестирования защищённости приложений (Static Application Security Testing, SAST). Предупреждения PVS-Studio можно классифицировать согласно Common Weakness Enumeration (CWE). Чтобы узнать о классификации предупреждений PVS-Studio согласно CWE, зачем нужно CWE, что это такое и так далее, предлагаю ознакомиться со следующими ссылками:
- Классификация предупреждений PVS-Studio согласно Common Weakness Enumeration;
- PVS-Studio: поиск дефектов безопасности.
Перейдём к вкладке «Options».
В разделе «Detectable Errors (C, C++)» мы можем управлять отображением типов сообщений анализатора. Те диагностические сообщения, которые по какой-то причине не актуальны для данного проекта, можно скрыть или отключить. Например, MISRA диагностики вряд ли заинтересуют кого-то, помимо embedded-разработчиков. Поэтому они отключены по умолчанию. Пользователя, который впервые решил воспользоваться анализатором, количество MISRA предупреждений может отпугнуть и ввести в ступор. А та часть пользователей, которые целенаправленно запустили анализатор, чтобы проверить свой проект на соответствие стандартам MISRA, могут просто включить их в настройках.
Тут можно ввести пути/маски для исключения некоторых файлов или папок из анализа. На выбор можно указать или маски по путям (Path Mask) или маски по именам файлов (FileName Mask). Они нужны, если требуется исключить из анализа сторонние библиотеки, автоматически сгенерированные файлы и т.п. После задания масок исключений, сообщения из соответствующих им файлов исчезнут из окна вывода PVS-Studio, а в следующую проверку они включены уже не будут. Таким образом, исключение файлов и директорий посредством масок может позволить существенно сократить общее время анализа всего проекта.
Подробнее тут.
Так же можно отфильтровать вывод анализатора по содержащемуся в нему тексту. Например, в вашем отчете анализатора есть предупреждения, в тексте которых упоминается функция my_super_function, однако вы точно уверены, что все эти предупреждения ложные. Тогда можно добавить слово my_super_function в это поле. Все предупреждения, которые содержали это слово, будут отфильтрованы. Ну и на всякий случай оставлю тут ссылку на соответствующий раздел документации.
Примечание. В PVS-Studio есть и другие способы разметки ложных предупреждений в коде или макросах. Они описаны в документации в разделе "Подавление ложных предупреждений".
После того, как мы закончили с обзором настроек, перейдём к проверке проекта. Как вы возможно заметили, в статье было несколько настроек, связанных с C++ проектами, а специфичных для C# и Java не было. Просто настроек по С++ больше, чем для C#, поэтому мы решили остановиться в этом кратком обзоре именно на них. Но для разнообразия повествования давайте проверим с помощью плагина к Visual Studio не C++, а C# проект и посмотрим, как выглядит отчёт анализатора.
Естественно, после первой проверки проекта вам придётся вернуться к настройкам, чтобы уменьшить процент ложных срабатываний. Ложные срабатывания неизбежны, но их процент можно уменьшить с помощью настройки до приемлемого значения. См. статью: "Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний".
Выбираем пункт «Analyze Solution with PVS-Studio».
Появится окно с прогресс баром.
А далее мы сможем посмотреть отчет анализатора.
К слову, тут тоже можно отфильтровать некоторые предупреждения. Например, можно скрыть первое предупреждение в нашем отчете, выбрав его и нажав пункт «Mark selected messages as False Alarms». За подробностями вновь отсылаем к разделу руководства "Подавление ложных предупреждений".
Linux
Ранее мы проверяли C# проект. Теперь попробуем проверить код, написанный на C++. Чтобы внести разнообразие в статью, проверим мы его под Linux. К слову, под Windows, Linux и macOS можно проверять проекты на любом языке (C, C++, C#, Java).
Клонируем репозиторий.
Запускаем конфигурационный скрипт для сборки.
Запускаем PVS-Studio в режиме трассировки и собираем проект. Необходима установленная утилита strace. Вместо команды make в вашем случае может быть любая команда запуска сборки проекта со всеми необходимыми параметрами.
Анализируем файлы из проекта, используя результаты предыдущего шага. Ключ -a позволяет указать, какие именно предупреждения должны попасть в отчет.
Конвертируем лог в html и наслаждаемся результатами.
Я описала лишь один вариант проверки проекта под Linux и весьма формально, не углубляясь в подробности. Есть и другие способы проверить проект, например, прописав вызов анализатора в makefile. Для более подробного ознакомления рекомендую обраться к следующими ссылкам:
- Знакомство со статическим анализатором PVS-Studio при разработке C++ программ в среде Linux;
- Как запустить PVS-Studio в Linux и macOS.
SonarQube
SonarQube — платформа с открытым исходным кодом для непрерывного анализа и измерения качества кода, поддерживающая большое количество языков программирования и позволяющая получать отчеты по таким метрикам, как дублирование кода, соответствие стандартам кодирования, покрытие тестами, сложность кода, потенциальные ошибки и т.д.
PVS-Studio имеет плагин для импорта результатов анализа в SonarQube, попробуем воспользоваться им.
Для начала получим отчёт анализатора и конфигурационный файл sonar-project.properties.
Далее нам нужна команда запуска сканера.
Результат :)
Также конфигурационный файл можно создать (или отредактировать). Например, на скрине выше мы включили добавление идентификатора MISRA к предупреждениям анализатора. Да, то есть по умолчанию MISRA отключена и тут. Если вам нужно проверить свой код на соответствие MISRA, то добавьте «active» в свой конфигурационный файл для включения.
Во вкладке Measures доступны различные метрики кода и графики.
Также строить графики можно при помощи секции 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, а плагин предоставляет удобный графический интерфейс для работы с анализатором.
Подробнее предлагаю прочитать в разделе руководства "Как запустить PVS-Studio Java".
Так же, проверяя Java проект можно подавлять сообщения анализатора, чтобы интеграция в большой проект была быстрой и безболезненной.
В IntelliJ IDEA это выглядит следующим образом.
В этом окошке мы видим отчет анализатора.
Нажимая правой кнопкой мыши по выбранному сообщению, мы видим такое контекстное меню. В нем мы можем выбрать выделенный пункт и сообщение исчезнет из вывода анализатора.
Также мы можем подавить все сообщения анализатора.
Для подавления предупреждений анализатора в 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 систему позволяет обнаружить баги сразу после сборки проекта. Это позволяет сократить затраты на поиск и исправление ошибок. Далее приведу ссылки на статьи с интеграциями с самыми популярными облачными сервисами:
- PVS-Studio идёт в облака: Travis CI
- PVS-Studio идёт в облака: Azure DevOps
- PVS-Studio идёт в облака: CircleCI
- PVS-Studio идёт в облака: GitLab CI/CD
- Запуск PVS-Studio в TeamCity
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Ekaterina Nikiforova. PVS-Studio 7.07: Features Overview.