1000_Release_7_21_ru/image1.png


Вышел новый релиз PVS-Studio – 7.21. В этой заметке описали основные улучшения анализатора и собрали материалы от нашей команды, вышедшие в последнее время: статьи, опросы и записи докладов с конференций.


Загрузить PVS-Studio 7.21 можно тут. Если нет лицензионного ключа, получить триал можно здесь.


Итак, что же нового?


Отчёты PVS-Studio, совместимые с GitLab Code Quality


1000_Release_7_21_ru/image2.png


Результаты работы PVS-Studio теперь можно сконвертировать в отчёт, совместимый с GitLab Code Quality. Это поможет следить за качеством проекта в рамках экосистемы GitLab.


В документации по использованию PVS-Studio в GitLab CI/CD описали, как получить такой отчёт.


Более тесная интеграция с Unreal Engine


Мы продолжаем развивать поддержку проектов на основе Unreal Engine. В этот раз сразу три новости:


  1. Научили анализатор понимать ещё больше типов, специфичных для Unreal Engine проектов. Хороших срабатываний должно стать больше, ложных – меньше.
  2. В документации описали, как с помощью PVS-Studio проверять Unreal Engine проекты под Linux.
  3. Сделали 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#". Пройти его можно здесь.


1000_Release_7_21_ru/image3.png


Кстати, напишите, если сможете пройти тест не на результат "Ты сборщик мусора". Или мне так не везёт, или наша C# команда всех затроллить решила… :)


Если вы пропустили другие интерактивы, вот они:


  • опрос "Кто ты в мире C++";
  • игра "Поиск ошибок в коде на 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. Полный список записей доступен здесь.


1000_Release_7_21_ru/image4.png


От нашей команды на конференции было 2 доклада, и оба посвящены вопросам безопасности:


  • Никита Липилин: SAST и SCA: поиск дефектов безопасности в коде проекта и его зависимостях. Ссылка.
  • Сергей Васильев: Обработка XML-файлов как причина появления уязвимостей. Ссылка.

Ещё одна конференция, доклады с которой стали доступны – Heisenbug 2022 Spring. Полный список записей докладов – здесь.


1000_Release_7_21_ru/image5.png


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


  • Сергей Васильев: Как устроено тестирование средства статического тестирования. Ссылка.
  • Сергей Васильев: Правильно ли вы парсите XML? Разбираемся с уязвимостями. Ссылка.

Комментарии (5)


  1. ijsgaus
    19.10.2022 10:42
    +1

    Я - LINQ - красивый, умный и ленивый. Так что всех, но по разному :-)


    1. foto_shooter Автор
      21.10.2022 14:19

      Только на третий день хождения вокруг этого комментария понял, что это результат прохождения теста. :)

      Видимо, пора в отпуск.


  1. homya4ok
    19.10.2022 22:23
    +1

    Версия 7.21, по-моему, некорректно сообщает о неинициализированной переменной в следующем коде:

    register int R4 __asm("r4");

    if (R4==SOME_CONST) {

    ...

    }


    1. foto_shooter Автор
      20.10.2022 08:40

      Попросил ребят из команды разработки посмотреть.


    1. foto_shooter Автор
      20.10.2022 16:29

      Это действительно false positive, спасибо. Исправим.