
Вышел новый релиз PVS-Studio – 7.21. В этой заметке описали основные улучшения анализатора и собрали материалы от нашей команды, вышедшие в последнее время: статьи, опросы и записи докладов с конференций.
Загрузить PVS-Studio 7.21 можно тут. Если нет лицензионного ключа, получить триал можно здесь.
Итак, что же нового?
Отчёты PVS-Studio, совместимые с GitLab Code Quality

Результаты работы PVS-Studio теперь можно сконвертировать в отчёт, совместимый с GitLab Code Quality. Это поможет следить за качеством проекта в рамках экосистемы GitLab.
В документации по использованию PVS-Studio в GitLab CI/CD описали, как получить такой отчёт.
Более тесная интеграция с Unreal Engine
Мы продолжаем развивать поддержку проектов на основе Unreal Engine. В этот раз сразу три новости:
- Научили анализатор понимать ещё больше типов, специфичных для Unreal Engine проектов. Хороших срабатываний должно стать больше, ложных – меньше.
- В документации описали, как с помощью PVS-Studio проверять Unreal Engine проекты под Linux.
- Сделали pull request, который позволит использовать больше настроек анализатора при работе с UE-проектами. Например, указывать таймаут для анализа файлов. Изменения уже закоммичены в код движка и будут доступны в следующей версии Unreal Engine.
Улучшение кроссплатформенных сценариев работы
Плагин PVS-Studio для Visual Studio теперь умеет работать с файлами подавления в формате JSON (ранее формат поддерживался только утилитах в Linux и macOS). Это упрощает кроссплатформенные сценарии работы с подавленными предупреждениями. Внедрить PVS-Studio в кроссплатформенные проекты с legacy-кодом также станет легче.
Новые возможности подавления предупреждений
Теперь вы можете автоматически фильтровать предупреждения анализатора, сообщения которых содержат определённый текст. Это позволит под��влять предупреждения по шаблону, не отключая диагностики целиком. Описать такой фильтр можно в .pvsconfig-файлах (C++, C#) или прямо в коде (только C++).
Рассмотрим пример. Диагностика V3022 C# анализатора PVS-Studio выдаёт предупреждение, если выражение в коде всегда истинно или ложно.
Взглянем на фрагмент кода:
static void ProcessStr(String str)
{
if (str == "temp")
{
if (str.Length != 0) // V3022 (expression is always true)
....
if (str.Length == 0) // V3022 (expression is always false)
....
}
}Допустим, мы не хотим выключать диагностику V3022 целиком, но хотим видеть только предупреждения на условия, которые всегда ложны. Для этого достаточно записать в .pvsconfig-файл такой фильтр:
//-V::3022::{always true}PVS-Studio отфильтрует предупреждения V3022, которые содержат текст "always true". На примере кода выше первое предупреждение пропадёт, а второе останется.
Документация по файлам конфигурации диагностик (.pvsconfig)
Файлы конфигурации диагностик позволяют конфигурировать поведение анализатора, например:
- изменить уровень диагностик;
- исключить из результатов анализа предупреждения по определённому паттерну;
- изменить текст предупреждения и т.п.
В новом разделе документации мы описали все возможности .pvsconfig-файлов и способы работы с ними в разном окружении.
Новые диагностики
C, C++
- V1090. The 'std::uncaught_exception' function is deprecated since C++17 and is removed in C++20. Consider replacing this function with 'std::uncaught_exceptions'.
- V1091. The pointer is cast to an integer type of a larger size. Casting pointer to a type of a larger size is an implementation-defined behavior.
- V1092. Recursive function call during the static/thread_local variable initialization might occur. This may lead to undefined behavior.
C#
- V3178. Calling method or accessing property of potentially disposed object may result in exception.
- V3179. Calling element access method for potentially empty collection may result in exception.
- V3180. The 'HasFlag' method always returns 'true' because the value '0' is passed as its argument.
- V3181. The result of '&' operator is '0' because one of the operands is '0'.
- V3182. The result of '&' operator is always '0'.
Интерактив
Сделали опрос "Кто ты в мире C#". Пройти его можно здесь.

Кстати, напишите, если сможете пройти тест не на результат "Ты сборщик мусора". Или мне так не везёт, или наша C# команда всех затроллить решила… :)
Если вы пропустили другие интерактивы, вот они:
Статьи
Для тех, кто пишет на C++:
- Топ-10 докладов на С++ конференциях 2019-2022 года (ссылка);
- Есть ли жизнь без RTTI: пишем свой dynamic_cast (ссылка);
- Боремся с 16-летним легаси-кодом, или исправляем C и C++ front-end в PVS-Studio (ссылка);
- Интервью с Джейсоном Тернером, одним из ведущих подкаста "CppCast": история и причины закрытия проекта (ссылка).
Для тех, кто пишет на C#:
- Сортировки в C#: OrderBy.OrderBy или OrderBy.ThenBy? Разбираемся, что эффективнее и почему (ссылка);
- Особенности реализации List в C# (ссылка);
- Чем опасны уязвимые зависимости в проекте и как с этим помогает SCA? (ссылка);
- Планируете взяться за .NET MAUI? Будьте готовы к приключениям с NullReferenceException (ссылка).
Поиск ошибок в коде проектов:
- игровой движок Stride (C#): ссылка;
- фреймворк машинного обучения ML.NET (C#): ссылка;
- сборочная система MSBuild (C#): ссылка;
- фреймворк и CMS Orchard Core (C#): ссылка;
- JavsScript-движок Rhino (Java): ссылка.
Доклады
В сеть выложили записи докладов с конференции DotNext 2022 Spring. Полный список записей доступен здесь.

От нашей команды на конференции было 2 доклада, и оба посвящены вопросам безопасности:
- Никита Липилин: SAST и SCA: поиск дефектов безопасности в коде проекта и его зависимостях. Ссылка.
- Сергей Васильев: Обработка XML-файлов как причина появления уязвимостей. Ссылка.
Ещё одна конференция, доклады с которой стали доступны – Heisenbug 2022 Spring. Полный список записей докладов – здесь.

Доклады от нашей команды: