За окном январь 2024 года, а это значит, пора подвести итоги за 2023 год! В этой статье мы не только рассмотрим всё новое, что появилось за 2023 год, но и освежим память по основным функциональным возможностям статического анализатора PVS-Studio.
PVS-Studio — это статический анализатор, выявляющий ошибки и потенциальные уязвимости в коде программ на C, C++, C# и Java. Инструмент помогает контролировать качество кода и улучшать его.
Больше информации — на странице продукта.
Загрузить актуальную версию PVS-Studio можно здесь.
Мы всегда стремимся увеличить список интеграций плагина PVS-Studio в сторонние инструменты и улучшить уже существующие. Новые плагины дают ещё больше вариантов кроссплатформенной работы!
В начале прошлого года появились две масштабные интеграции с известными IDE — Visual Studio Code и Qt Creator.
Сейчас плагины PVS-Studio есть для следующих IDE:
За это время была проделана большая работа над новыми плагинами: с простого просмотра отчёта в IDE до полной поддержки, включая анализ проектов, подавление предупреждений и многое другое.
Помимо этого, теперь плагины поддерживают возможность массового подавления предупреждений, используя suppress-файлы. Это упростит работу с предупреждениями анализатора в legacy-коде, позволяя работать только с новыми предупреждениями, что облегчит внедрение анализатора в проект.
Подробнее об упрощении внедрения PVS-Studio в проект читайте в статье "Как внедрить статический анализатор кода в legacy проект и не демотивировать команду".
Visual Studio Code
Плагин PVS-Studio для Visual Studio Code в середине года получил возможность анализировать проекты на C и C++, а теперь ещё и .NET проектов.
Примечание. Кстати, в 2024 году мы планируем поддержать анализ Java кода в Visual Studio Code, но об этом позже.
Функционал включает в себя:
Так выглядит интерфейс плагина для Visual Studio Code:
Qt Creator
Текущая версия плагина PVS-Studio для Qt Creator, помимо полной функциональности анализа, позволяет проверять проекты, ориентированные на QMake, CMake или Qbs.
Стало возможно использовать плагин PVS-Studio для Qt Creator не только под Windows и Linux, но и под macOS на архитектуре x86-64.
Так выглядит интерфейс плагина для Qt Creator:
Подробнее об использовании PVS-Studio в Qt Creator можно узнать в документации.
В одной из последних версий Rider появилась возможность прямого открытия проектов Unreal Engine. Плагин PVS-Studio теперь поддерживает запуск анализа в этом режиме. Подробности можно узнать в документации.
Так выглядит интерфейс плагина для Rider:
Результаты анализа PVS-Studio можно конвертировать в форматы, используемые в других инструментах. Теперь результаты анализа PVS-Studio можно использовать и в DefectDojo.
DefectDojo — это DevSecOps-платформа для работы с инструментами обеспечения безопасности. Подробности интеграции описаны в документации.
Так выглядит отчёт плагина в DefectDojo:
Это полезно, когда вы используете сразу несколько инструментов. Например, можно проверить код с помощью PVS-Studio, а результаты преобразовать в формат для TeamCity и дальше работать, в том числе и в этой CI-системе.
Поддерживаемые форматы: TeamCity, SARIF, GitLab, MISRA Compliance, DefectDojo и др. Полный список форматов можно найти в документации об утилитах конвертации.
В 2023 году мы поддержали возможность анализа проектов на .NET 8 и C# 12. Сам C# анализатор под Linux и macOS, кстати, теперь тоже работает на .NET 8.
Помимо этого, традиционно мы обновляем зависимости анализатора с выходом новой версии .NET: MSBuild и Roslyn. Это позволяет анализировать C# проекты, использующие новый синтаксис и ориентированные на новый SDK.
Анализатор PVS-Studio на всех языках (C, C++, C#, Java) работает на 3 основных платформах: Windows, Linux и macOS.
Мы добавили поддержку работы на платформе Windows ARM. Поддержка работает в режиме совместимости с архитектурой x64.
Кстати, в 2024 году планируется реализация нативной ARM версии анализатора для операционных систем семейства macOS.
PVS-Studio поддерживает кроссплатформенный анализ проектов независимо от используемой сборочной системы. Для проверки таких проектов существует специальная утилита. Более подробно можно узнать об этом в документации.
Фильтр Best Warnings помогает отобрать из всех предупреждений анализатора самые интересные. Механизм отбора предупреждений основан на анализе разнообразных проектов и найденных в них наиболее распространённых и опасных ошибках.
Данный механизм будет особенно полезен при первом знакомстве с PVS-Studio, так как поможет в один клик посмотреть самые интересные срабатывания, которые с наибольшей вероятностью являются реальными ошибками.
Мы продолжаем улучшать этот инструмент, поддерживая новые IDE, где его можно использовать, и дорабатывая механизм подбора предупреждений. Более подробно про использование Best Warnings можно прочитать в документации.
Использовать его достаточно просто: нужно выбрать пункт "Best" в окне анализатора. Предупреждений в подборке будет не больше 10, и вы сможете просмотреть их достаточно быстро.
Если вы хотите побольше узнать, как быстро начать работу с PVS-Studio, советую прочитать заметку "PVS-Studio: 2 фишки для быстрого старта".
Механизм подавления предупреждений анализатора, который также называют созданием baseline-уровня сообщений — это полезный инструмент, помогающий в следующих сценариях:
С помощью suppress-файлов предупреждения анализатора можно подавить специальным образом, чтобы они больше не попадали в новые отчёты. Использование этого режима не требует модификации файлов с исходным кодом проекта.
Давайте рассмотрим, как можно подавить предупреждения на примере работы плагина PVS-Studio для Visual Studio:
В Visual Studio результат анализа будет отображён в специальном окне.
Окно PVS-Studio в IDE предоставляет широкие возможности фильтрации и сортировки результатов. Также присутствует возможность быстрого перехода к документации выбранной диагностики.
Дополнительные возможности работы с каждым сообщением доступны в контекстном меню по нажатию на правую кнопку мыши на сообщении.
Для добавления выбранных предупреждений во все suppress-файлы, связанные с предупреждениями, имеется пункт меню "Add selected messages to all suppression files".
Кроме этого пункта меню имеется пункт "Add selected messages to primary suppression files". Он позволяет подавить предупреждения только в primary suppress-файлы. Если вы хотите подавлять новые предупреждения анализатора только в какой-то конкретный suppress-файл, но при этом у вас имеются другие suppress-файлы с подавленными ранее предупреждениями, которые вы не хотите модифицировать, то пометьте ваш suppress-файл для новых срабатываний как primary.
При выборе одного предупреждения в контекстном меню доступны пункты не только для подавления/расподавления, но и для перемещения. При перемещении предупреждение удаляется из всех suppress-файлов и добавляется в выбранные suppress-файлы.
После этого к подавленным предупреждениям можно вернуться в любой удобный момент, включив их отображение:
Кроме этого, в подменю таблицы при отображении подавленных предупреждений появляется список с отображаемыми suppress-файлами. Убирая или выставляя галочку в чекбоксах из этого списка, возможно включать или отключать отображение подавленных предупреждений из определённых suppress-файлов:
Более подробно про возможности 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 помогает задать дополнительные настройки для анализа и фильтрации сообщений анализатора.
Пример:
//-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 можно прочитать в документации.
Анализ Unity проектов с помощью PVS-Studio продолжает развиваться! В этом году мы добавили новую группу диагностик, направленных на оптимизации исходного кода проектов, использующих игровой движок Unity.
На текущий момент представлены следующие диагностические правила:
Более подробно про анализ проектов на Unity можно узнать в документации.
Если вы хотите больше узнать про возможности оптимизации проектов на Unity, советую ознакомиться с заметкой: "PVS-Studio помогает оптимизировать проекты на Unity Engine"
Напомним, что PVS-Studio работает с проектами как на Unreal Engine 4, так и на Unreal Engine 5.
Периодически при проверке проектов с помощью PVS-Studio возникали проблемы с избыточным потреблением памяти и замедлением анализа. Они вызваны использованием системы объединения единиц трансляции в один файл (Unity Build).
Несмотря на то, что использование такой системы может положительно сказаться на времени компиляции, большой размер файла может привести к повышенному потреблению ресурсов, необходимых для анализа.
Мы дополнили документацию по анализу Unreal Engine проектов пунктом про настройку запуска анализа без Unity Build, но с возможностью использования этого режима для сборки проекта.
Как мы уже говорили выше, в одной из последних версий Rider появилась возможность открывать проекты Unreal Engine напрямую, и плагин PVS-Studio теперь поддерживает запуск анализа в этом режиме! Подробности про такой режим можно узнать в документации.
Учёт оператора 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++ кода
Аннотации функций помогают PVS-Studio получить дополнительную информацию, которую он может использовать при анализе.
В C++ анализаторе был доработан механизм пользовательского аннотирования функций. Теперь можно писать аннотации для функций на любом уровне вложенности. Помимо этого, при аннотировании допускается использование имени функции без указания класса и пространства имён.
Более подробно про создание аннотаций можно узнать в документации.
В 2023 году мы добавили 32 новые диагностики. Более наглядно развитие анализатора можно увидеть на графике количества диагностик:
Полный список новых диагностик, появившихся в 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
Полный список диагностик доступен на этой странице.
В этом году мы добавили на сайт возможность создавать свой аккаунт и заходить в свой личный кабинет. Кнопки регистрации и авторизации можно найти в шапке сайта, наведя курсор на иконку:
Личный кабинет позволяет:
Приглашаем всех зарегистрироваться!
Подробнее о личном кабинете можете прочитать в заметке.
Переработана документация по анализу в режиме коммитов и слияния веток
Мы полностью переписали документацию по анализу в режиме коммитов и слияния веток (pull/merge request). Также мы добавили отдельные страницы документации, посвящённые интеграции анализатора в CI системы AppVeyor (здесь) и Buddy (здесь).
Полностью переработана документация по Java анализатору
В документации теперь существует раздел для каждого сценария работы с анализатором:
Доработана документация по интеграции результатов анализа в SonarQube
Мы также улучшили документацию по интеграции результатов анализа в SonarQube. Появилась информация о том, как "подружить" C# анализатор PVS-Studio и SonarQube под Linux и macOS. Страница доступна здесь.
Мы постарались рассказать обо всех важных нововведениях в анализаторе за 2023 год, но даже так мы охватили лишь часть. Полный список изменений можно найти на странице истории релизов.
А если вам интересно своевременно узнавать, что нового появляется в анализаторе, подписывайтесь на наши рассылки пресс-релизов (а ещё там появилась рассылка с IT-ивентами для разработчиков!).
А какие изменения вы бы хотели увидеть в PVS-Studio в 2024 году? Делитесь с нами своими идеями в комментариях!
Не забывайте обновляться до последней версии PVS-Studio! Все эти улучшения будут доступны в ней! Вы всегда можете найти самую актуальную версию здесь.