PVS-Studio в 2023

За окном январь 2024 года, а это значит, пора подвести итоги за 2023 год! В этой статье мы не только рассмотрим всё новое, что появилось за 2023 год, но и освежим память по основным функциональным возможностям статического анализатора PVS-Studio.

8c58cffa5b927ba8855a43fd04791999.pngЕсли вы наткнулись на статью случайно и не знаете, что такое PVS-Studio

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

Больше информации — на странице продукта.

Загрузить актуальную версию PVS-Studio можно здесь.

Новые возможности интеграции PVS-Studio

Мы всегда стремимся увеличить список интеграций плагина PVS-Studio в сторонние инструменты и улучшить уже существующие. Новые плагины дают ещё больше вариантов кроссплатформенной работы!

Плагины для Visual Studio Code и Qt Creator

В начале прошлого года появились две масштабные интеграции с известными IDE — Visual Studio Code и Qt Creator.

Сейчас плагины PVS-Studio есть для следующих IDE:

  • Visual Studio;

  • Visual Studio Code;

  • Qt Creator;

  • Rider;

  • CLion;

  • IntelliJ IDEA.

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

Помимо этого, теперь плагины поддерживают возможность массового подавления предупреждений, используя suppress-файлы. Это упростит работу с предупреждениями анализатора в legacy-коде, позволяя работать только с новыми предупреждениями, что облегчит внедрение анализатора в проект.

Подробнее об упрощении внедрения PVS-Studio в проект читайте в статье «Как внедрить статический анализатор кода в legacy проект и не демотивировать команду».

Visual Studio Code

Плагин PVS-Studio для Visual Studio Code в середине года получил возможность анализировать проекты на C и C++, а теперь ещё и .NET проектов.

Примечание. Кстати, в 2024 году мы планируем поддержать анализ Java кода в Visual Studio Code, но об этом позже.

Функционал включает в себя:

  • Запуск анализа и просмотр отчёта;

  • Подавление предупреждений с помощью suppress-файлов;

  • Поддержку pvsconfig файлов;

  • Другие функции, описанные в соответствующем разделе документации.

Так выглядит интерфейс плагина для Visual Studio Code:

c1176ba756358773c76ca2fc0fddfbf5.png

Qt Creator

Текущая версия плагина PVS-Studio для Qt Creator, помимо полной функциональности анализа, позволяет проверять проекты, ориентированные на QMake, CMake или Qbs.

Стало возможно использовать плагин PVS-Studio для Qt Creator не только под Windows и Linux, но и под macOS на архитектуре x86–64.

Так выглядит интерфейс плагина для Qt Creator:

c54866abd87267db2337b5c765f114d1.png

Подробнее об использовании PVS-Studio в Qt Creator можно узнать в документации.

Улучшения плагина для Rider

В одной из последних версий Rider появилась возможность прямого открытия проектов Unreal Engine. Плагин PVS-Studio теперь поддерживает запуск анализа в этом режиме. Подробности можно узнать в документации.

Так выглядит интерфейс плагина для Rider:

3a96f33a1435b8dbaf1b7c79da08a47f.png

Интеграция с DefectDojo

Результаты анализа PVS-Studio можно конвертировать в форматы, используемые в других инструментах. Теперь результаты анализа PVS-Studio можно использовать и в DefectDojo.

DefectDojo — это DevSecOps-платформа для работы с инструментами обеспечения безопасности. Подробности интеграции описаны в документации.

Так выглядит отчёт плагина в DefectDojo:

0beee4b58994b11b876a11ddd6507744.png

Это полезно, когда вы используете сразу несколько инструментов. Например, можно проверить код с помощью PVS-Studio, а результаты преобразовать в формат для TeamCity и дальше работать, в том числе и в этой CI-системе.

Поддерживаемые форматы: TeamCity, SARIF, GitLab, MISRA Compliance, DefectDojo и др. Полный список форматов можно найти в документации об утилитах конвертации.

Новые возможности

Поддержка новых версий .NET и C#

В 2023 году мы поддержали возможность анализа проектов на .NET 8 и C# 12. Сам C# анализатор под Linux и macOS, кстати, теперь тоже работает на .NET 8.

Помимо этого, традиционно мы обновляем зависимости анализатора с выходом новой версии .NET: MSBuild и Roslyn. Это позволяет анализировать C# проекты, использующие новый синтаксис и ориентированные на новый SDK.

Поддержка архитектуры ARM

Анализатор PVS-Studio на всех языках (C, C++, C#, Java) работает на 3 основных платформах: Windows, Linux и macOS.

Мы добавили поддержку работы на платформе Windows ARM. Поддержка работает в режиме совместимости с архитектурой x64.

Кстати, в 2024 году планируется реализация нативной ARM версии анализатора для операционных систем семейства macOS.

PVS-Studio поддерживает кроссплатформенный анализ проектов независимо от используемой сборочной системы. Для проверки таких проектов существует специальная утилита. Более подробно можно узнать об этом в документации.

Улучшение функциональности

Best Warnings

Фильтр Best Warnings помогает отобрать из всех предупреждений анализатора самые интересные. Механизм отбора предупреждений основан на анализе разнообразных проектов и найденных в них наиболее распространённых и опасных ошибках.

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

Мы продолжаем улучшать этот инструмент, поддерживая новые IDE, где его можно использовать, и дорабатывая механизм подбора предупреждений. Более подробно про использование Best Warnings можно прочитать в документации.

Использовать его достаточно просто: нужно выбрать пункт «Best» в окне анализатора. Предупреждений в подборке будет не больше 10, и вы сможете просмотреть их достаточно быстро.

b643fd69c270773bef46a65ad86ce315.png

Если вы хотите побольше узнать, как быстро начать работу с PVS-Studio, советую прочитать заметку «PVS-Studio: 2 фишки для быстрого старта».

Улучшение работы с файлами подавления

Механизм подавления предупреждений анализатора, который также называют созданием baseline-уровня сообщений — это полезный инструмент, помогающий в следующих сценариях:

  • Анализатор PVS-Studio используется впервые в проекте и выдаёт большое количество предупреждений на весь код. Механизм подавления поможет проводить регулярный анализ только на новом коде, при этом к подавленным предупреждениям можно будет вернуться позже;

  • Анализатор PVS-Studio уже используется в проекте на регулярной основе. В процессе анализа кода в отчёте могут попадаться ложные предупреждения, и их хочется подавить без модификации файлов с исходным кодом.

С помощью suppress-файлов предупреждения анализатора можно подавить специальным образом, чтобы они больше не попадали в новые отчёты. Использование этого режима не требует модификации файлов с исходным кодом проекта.

Давайте рассмотрим, как можно подавить предупреждения на примере работы плагина PVS-Studio для Visual Studio:

В Visual Studio результат анализа будет отображён в специальном окне.

f5adf65e02fb699f047de36733f0c8f7.png

Окно PVS-Studio в IDE предоставляет широкие возможности фильтрации и сортировки результатов. Также присутствует возможность быстрого перехода к документации выбранной диагностики.

Дополнительные возможности работы с каждым сообщением доступны в контекстном меню по нажатию на правую кнопку мыши на сообщении.

bedc6811389cdf27c540af9e4d574455.png

Для добавления выбранных предупреждений во все suppress-файлы, связанные с предупреждениями, имеется пункт меню «Add selected messages to all suppression files».

Кроме этого пункта меню имеется пункт «Add selected messages to primary suppression files». Он позволяет подавить предупреждения только в primary suppress-файлы. Если вы хотите подавлять новые предупреждения анализатора только в какой-то конкретный suppress-файл, но при этом у вас имеются другие suppress-файлы с подавленными ранее предупреждениями, которые вы не хотите модифицировать, то пометьте ваш suppress-файл для новых срабатываний как primary.

При выборе одного предупреждения в контекстном меню доступны пункты не только для подавления/расподавления, но и для перемещения. При перемещении предупреждение удаляется из всех suppress-файлов и добавляется в выбранные suppress-файлы.

После этого к подавленным предупреждениям можно вернуться в любой удобный момент, включив их отображение:

c3b4bc6e4fc3b72899b765b549b66e38.png

Кроме этого, в подменю таблицы при отображении подавленных предупреждений появляется список с отображаемыми suppress-файлами. Убирая или выставляя галочку в чекбоксах из этого списка, возможно включать или отключать отображение подавленных предупреждений из определённых suppress-файлов:

879a56bf865e629b3b816b8c9583670b.png

Более подробно про возможности suppress-файлов можно узнать в документации.

Мы расширили возможности работы с файлами подавления для Visual Studio. Раньше предполагалось, что в проекте может быть только один suppress-файл. Теперь же к каждому проекту может относиться несколько файлов подавления.

В утилитах PVS-Studio_Cmd.exe и pvs-studio-dotnet появился новый режим — suppression. С помощью него можно производить различные операции с suppress-файлами из командной строки.

Например, с помощью команды можно создать suppress-файлы для каждого проекта из решения:

PVS-Studio_Cmd.exe suppression -m CreateEmptySuppressFiles ^
                               -t JulietTestSuite.sln ^
                               -P myPrefix%projName%myPostfix.suppress

В результате выполнения этой команды в каждый проект будет добавлен соответствующий suppress-файл, имя которого будет генерироваться на основе имени соответствующего проекта.

Также появилась возможность подавления предупреждений по определённым критериям:

PVS-Studio_Cmd.exe suppression -m Suppress ^
                               -t JulietTestSuite.sln ^
                               -P myPrefix%projName%myPostfix.suppress ^
                               -R JulietTestSuite.plog ^
                               --groups "GA:3|OWASP"

Указанная команда подавит предупреждения из отчёта 'JulietTestSuite.plog' в suppress-файлы, соответствующие паттерну, переданному через параметр '-P'. При этом подавлены будут только предупреждения 3 уровня группы General Analysis и все предупреждения группы OWASP.

Все возможности нового режима подробно описаны в документации.

Больше возможностей pvsconfig

Файл конфигурации pvsconfig помогает задать дополнительные настройки для анализа и фильтрации сообщений анализатора.

Пример:

//-V::3022,5623:1,3

Эта запись позволит исключить срабатывания диагностик V3022 и V5623 уровня 'High' и 'Low'.

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

//-V::MISRA
//+V::2511,2578

Другим нововведением является возможность явного задания приоритетов файлов pvsconfig. Это актуально, когда настройки разных файлов конфигурации конфликтуют друг с другом. Например, один из файлов может выключать какую-то диагностику, а другой — включать.

Теперь появилась возможность указания в pvsconfig приоритетов. Для этого в файл конфигурации надо добавить строку следующего вида:

//CONFIG_PRIORITY::1

Чем меньше число, тем выше приоритет файла. Если директива отсутствует, то приоритеты расставляются в зависимости от имён файлов.

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

//V_SOLUTION_DIR_AS_SOURCE_TREE_ROOT

Более подробно про использование файлов конфигурации диагностик pvsconfig можно прочитать в документации.

GameDev

Unity

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

На текущий момент представлены следующие диагностические правила:

  • V4001 указывает на фрагменты кода, в которых производится упаковка;

  • V4002 находит выражения, в которых конкатенации строк стоит заменить на StringBuilder;

  • V4003 обнаруживает места, в которых можно избежать захвата переменных анонимной функцией;

  • V4004 говорит о потенциальной возможности оптимизации использования «тяжёлых» свойств, создающих новые коллекции при каждом обращении;

  • V4005 находит места, где в часто выполняемом коде производятся обращения к ресурсоёмким свойствам или методам.

Более подробно про анализ проектов на Unity можно узнать в документации.

Если вы хотите больше узнать про возможности оптимизации проектов на Unity, советую ознакомиться с заметкой: «PVS-Studio помогает оптимизировать проекты на Unity Engine»

Unreal Engine

Напомним, что PVS-Studio работает с проектами как на Unreal Engine 4, так и на Unreal Engine 5.

Периодически при проверке проектов с помощью PVS-Studio возникали проблемы с избыточным потреблением памяти и замедлением анализа. Они вызваны использованием системы объединения единиц трансляции в один файл (Unity Build).

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

Мы дополнили документацию по анализу Unreal Engine проектов пунктом про настройку запуска анализа без Unity Build, но с возможностью использования этого режима для сборки проекта.

Как мы уже говорили выше, в одной из последних версий Rider появилась возможность открывать проекты Unreal Engine напрямую, и плагин PVS-Studio теперь поддерживает запуск анализа в этом режиме! Подробности про такой режим можно узнать в документации.

Улучшение анализа

C#

Учёт оператора null-forgiving ('!') в C#

В C# 9 в язык добавили возможность условного разделения ссылочных типов на допускающие и не допускающие null. Подробности — в официальной документации.

Когда ссылочная переменная может иметь значение null, к имени её типа добавляется '?'. Если же в конкретной ситуации такое выражение точно не возвращает нулевую ссылку, разработчики могут использовать оператор null-forgiving ('!'). Пример:

bool _returnText = false;

void Foo()
{
  _returnText = true;

  string value = GetText()!;
  _ = value.Length;
}

// may return null
private string? GetText()
{
  return _returnText ? "some text" : null;
}

Метод GetText в некоторых обстоятельствах действительно может возвращать null, однако результат его вызова внутри Foo точно является строкой «some text». Пометив вызов с помощью постфиксного '!', разработчик сообщает компилятору, что выражение не равно null.

Анализатор начал учитывать оператор null-forgiving при выдаче предупреждений. Теперь PVS-Studio не будет выдавать предупреждения о разыменовании потенциально нулевой ссылки, если выражение размечено с помощью '!'. Однако предупреждение всё же будет показано, если null является единственным возможным значением выражения.

C++

Новые возможности аннотации функций C и C++ кода

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

В C++ анализаторе был доработан механизм пользовательского аннотирования функций. Теперь можно писать аннотации для функций на любом уровне вложенности. Помимо этого, при аннотировании допускается использование имени функции без указания класса и пространства имён.

Более подробно про создание аннотаций можно узнать в документации.

Новые диагностики

В 2023 году мы добавили 32 новые диагностики. Более наглядно развитие анализатора можно увидеть на графике количества диагностик:

5f8f703f90a22ecf8396d087b8a716be.png

Полный список новых диагностик, появившихся в 2023 году:

Для С и С++ анализатора: V837, V838, V1093, V1094, V1095, V1096, V1097, V1098, V1099, V1100, V1101, V1102, V1103, V2020, V2623, V2624

Для С# анализатора: V3184, V3185, V3186, V3187, V3188, V3189, V3190, V3191, V3192, V3193, V4001, V4002, V4003, V4004, V4005

Для Java анализатора: V6107

Полный список диагностик доступен на этой странице.

Разное

Личный кабинет пользователя

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

74010065322eb58b6b65d45a252158fc.png

Личный кабинет позволяет:

  • просматривать список своих триальных ключей;

  • подписываться на комментарии к статьям;

  • получать оповещения об ответах на ваши комментарии;

  • настраивать подписки на рассылки о новых статьях и релизах.

49e7d5b79bab131f71bc821a21c81ac9.png

Приглашаем всех зарегистрироваться!

Подробнее о личном кабинете можете прочитать в заметке.

Переработка документации

Переработана документация по анализу в режиме коммитов и слияния веток

Мы полностью переписали документацию по анализу в режиме коммитов и слияния веток (pull/merge request). Также мы добавили отдельные страницы документации, посвящённые интеграции анализатора в CI системы AppVeyor (здесь) и Buddy (здесь).

Полностью переработана документация по Java анализатору

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

Доработана документация по интеграции результатов анализа в SonarQube

Мы также улучшили документацию по интеграции результатов анализа в SonarQube. Появилась информация о том, как «подружить» C# анализатор PVS-Studio и SonarQube под Linux и macOS. Страница доступна здесь.

Заключение

Мы постарались рассказать обо всех важных нововведениях в анализаторе за 2023 год, но даже так мы охватили лишь часть. Полный список изменений можно найти на странице истории релизов.

А если вам интересно своевременно узнавать, что нового появляется в анализаторе, подписывайтесь на наши рассылки пресс-релизов (а ещё там появилась рассылка с IT-ивентами для разработчиков!).

А какие изменения вы бы хотели увидеть в PVS-Studio в 2024 году? Делитесь с нами своими идеями в комментариях!

Не забывайте обновляться до последней версии PVS-Studio! Все эти улучшения будут доступны в ней! Вы всегда можете найти самую актуальную версию здесь.

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Gleb Aslamov. PVS-Studio in 2023.

© Habrahabr.ru