Вышел новый релиз 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. Полный список записей докладов – здесь.
Доклады от нашей команды:
Комментарии (5)
homya4ok
19.10.2022 22:23+1Версия 7.21, по-моему, некорректно сообщает о неинициализированной переменной в следующем коде:
register int R4 __asm("r4");
if (R4==SOME_CONST) {
...
}
ijsgaus
Я - LINQ - красивый, умный и ленивый. Так что всех, но по разному :-)
foto_shooter Автор
Только на третий день хождения вокруг этого комментария понял, что это результат прохождения теста. :)
Видимо, пора в отпуск.