Базовый Уровень Unreal Или Улучшения Pvs-Studio Для Проектов Unreal Engine

Статический анализатор PVS-Studio постоянно развивается: совершенствуются различные механизмы, происходит интеграция с игровыми движками, IDE, CI/CD и другими системами и сервисами.

Благодаря этому несколько лет назад появилась возможность использовать PVS-Studio для анализа проектов Unreal Engine. Однако один из важных механизмов PVS-Studio — подавление сообщений анализатора (baselining, отключение предупреждений для существующего кода) — не работал с проектами UE. Почему это не было реализовано сразу, и как в итоге была решена эта задача – читайте далее.



Базовый уровень Unreal или улучшения PVS-Studio для проектов Unreal Engine



Базовый уровень

Baselining в PVS-Studio — это механизм, позволяющий провести «условную линию» для предупреждений анализатора, выданных в ходе анализа проекта.

Анализатор использует эту «полоску» и показывает пользователю только те предупреждения, которые не отсекаются этой «полоской».

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

Эти файлы учитываются при последующих запусках анализатора, и подавленные предупреждения не появляются в итоговом отчете.

На практике это позволяет получать в результате анализа только актуальные предупреждения, выданные для нового или измененного кода.

Этот механизм особенно полезен при внедрении PVS-Studio в существующий проект. В этом случае первый анализ может выдать огромное количество предупреждений (обычно количество ошибок зависит от размера кодовой базы).

Вместо того, чтобы пытаться обработать их все сразу, вы можете просто подавить их.

В результате при следующем анализе будут выдаваться только «свежие» предупреждения анализатора.

Вы всегда можете вернуться к скрытым сообщениям.

Плагины PVS-Studio для IDE также имеют возможность массового подавления и переотображения выбранных пользователем триггеров анализатора.

Также рекомендую прочитать статью, посвященную описанным выше вопросам» Как внедрить статический анализатор кода в устаревший проект, не демотивируя команду ".



PVS-Studio и Unreal Engine

На данный момент есть несколько вариантов проверка проектов Unreal Engine с помощью PVS-Studio .

Одним из наиболее удобных для регулярного использования является плагин для Visual Studio .

Это позволяет вам прямо в IDE:

  • провести анализ проекта У?;
  • перемещаться по сообщениям анализатора;
  • обрабатывать сообщения анализатора, не отрываясь от написания кода.

От такого удобства разработчика УП отделяет всего пара простых настроек:
  • В свойствах проекта UE на вкладке NMake вам необходимо добавить флаг «-StaticAnalyzer=PVSStudio» к команде сборки и перестройки проекта.

    Важный: при добавлении этого флага проект не будет собираться/пересобираться, но будет запущен анализ;

  • включите автоматическую загрузку отчета анализатора для проектов UE в плагине: PVS-Studio > Параметры > Специальные настройки анализатора > Сохранить/Загрузить (отчет анализатора) > AutoloadUnrealEngineLog.
После этого вы сможете проанализировать проект UE в Visual Studio:
  • Чтобы проанализировать весь проект, вам необходимо перестроить проект. Результаты анализа будут сохранены в отчете, путь к которому будет отображаться в окне вывода.

    Полученный отчет будет автоматически загружен плагином PVS-Studio в таблицу сообщений анализатора;

  • Для анализа файлов, изменившихся с момента последнего запуска анализатора, необходимо запустить сборку проекта (Build Solution).

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

    h.

Подобные возможности реализованы в плагине PVS-Studio для Райдера .

Так почему же при всех имеющихся возможностях PVS-Studio сообщения базового анализатора для проектов UE не поддерживались до релиза 7.16? Причем в версии 7.16 улучшения этого механизма были внесены только в утилиту командной строки PVS-Studio_Cmd.exe. И только в версии анализатора 7.17 базовое определение было реализовано в плагинах для Visual Studio и JetBrains Rider. Чтобы ответить на этот вопрос, необходимо поговорить об особенностях проектов У?.



Особенности проектов Unreal Engine

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

Увы, это не так просто.

Давайте рассмотрим механизмы, которые используются при анализе в PVS-Studio (не только для проектов UE):

  • Прежде чем анализировать обычные C++ (non-UE) проекты, анализатор собирает информацию о проекте для наиболее полного и качественного анализа.

    Эту информацию предоставляет система сборки.

    Например, MSBuild.

  • Для сборки проектов UE используется специализированная система сборки Unreal Build Tool (UBT), которая интегрируется поверх системы сборки MSBuild, используемой в Visual Studio и JetBrains Rider.
  • Проекты-оболочки, созданные MSBuild для Unreal Engine, не содержат всей необходимой информации для полноценного анализа.

  • Из-за предыдущего пункта мне пришлось интегрировать ядро C++-анализатора (PVS-Studio.exe) непосредственно в UBT, чтобы получить от него всю необходимую информацию для анализа проекта.

  • Механизм базовой линии привязан к проектам MSBuild и утилите PVS-Studio_Cmd.exe, а не к PVS-Studio.exe.
  • Плагины для IDE также привязаны к механизму базовой линии в PVS-Studio_Cmd.exe.
Таким образом, существенные различия в проектах UE не позволили повторно использовать механизм baselining не только в консольной утилите, но и в IDE-плагинах.

Также интеграция ядра C++ (PVS-Studio.exe) в UBT наложила дополнительные ограничения на анализ проектов УП из PVS-Studio_Cmd.exe. Эти ограничения коснулись и плагинов для IDE, поскольку они взаимодействуют с этой консольной утилитой.

Однако некоторых ограничений для IDE удалось избежать, а именно:

  • флаг -StaticAnalyzer=PVSStudio позволял запускать анализ через PVS-Studio.exe из IDE-плагинов при сборке/пересборке проекта;
  • Подписка на событие сборки позволила автоматически загружать результаты анализа в плагины IDE.


Базовый уровень Unreal или улучшения PVS-Studio для проектов Unreal Engine

Давайте посмотрим, какие изменения необходимо внести в утилиту PVS-Studio_Cmd.exe, а также в код плагинов для Visual Studio и JetBrains Rider, чтобы обеспечить работу механизма baselining с проектами UE.

Улучшения в механизме базовой линии в PVS-Studio_Cmd.exe для проектов Unreal Engine.

В версии 7.16 механизм базовой линии в PVS-Studio_Cmd.exe был расширен.

Во-первых, добавлена возможность фильтровать сообщения анализатора из отчета (файла plog) с помощью файла супрессии.

Во-вторых, расширен режим подавления сообщений, который теперь можно использовать с отчетами по проектам UE. Данная модификация позволила использовать базовую настройку в тех случаях, когда нет необходимости (или возможности) использовать UI. Например, при интеграции PVS-Studio в различные CI/CD ( Трэвис Си , Круг CI , Гитлаб , Лазурный ).

Режим подавления сообщений непосредственно из отчетов PVS-Studio (файлов plog) уже существовал до описанных улучшений.

Его суть заключается в добавлении сообщений из отчетов анализатора в файлы подавления проекта/решения без запуска анализа.

Пример команды для подавления всех сообщений из отчета:

  
   

PVS-Studio_Cmd.exe -t path/to/solution/file -a SuppressOnly -o path/to/report -u path/to/suppress/file

Этот режим активируется с помощью флага «-a SuppressOnly».

Также можно указать в необязательном аргументе «-u» путь к файлу подавления, не связанному с проектом.

В результате файл подавления будет (пере)записан по этому пути, и все сообщения из отчета, переданные в аргументе '-o', будут добавлены в него, как и в файлах подавления проекта/решения.

Кроме того, добавлен режим фильтрации сообщений из отчета анализатора.

Он отличается от режима SuppressOnly тем, что он создает отфильтрованный отчет на основе '-o', переданного в аргументе.

Отфильтрованный отчет содержит только те предупреждения, которые не были найдены в файлах подавления решения, проектов и файле подавления из аргумента «-u».

Этот отчет сохраняется в формате .

plog с постфиксом «_filtered» рядом с отчетом из аргумента «-o».

Пример команды для фильтрации отчета:

PVS-Studio_Cmd.exe -t path/to/solution/file -a FilterFromSuppress ^ -o path/to/report -u path/to/suppress/file

Аргументы, используемые для этого режима работы, аналогичны режиму SuppressOnly .

Чтобы активировать его, необходимо указать флаг «-a FilterFromSuppress».

Оба описанных выше режима добавляют дополнительные возможности по работе с отчетами анализатора, причем не только для проектов УП.

Однако здесь все оказалось не так просто, потому что механизм baselining не может создавать и использовать супрессивные файлы на уровне проектов UE. Учитывая эту функцию, чтобы базовый план работал, вам нужно либо добавить файл подавления на уровне решения, либо передать его в аргументе «-u» при использовании режимов.

SuppressOnly или ФильтрИзПодавить .

Более подробную информацию об этих и других особенностях механизма определения базовой линии для проектов ЕС можно найти в документация (раздел «Подавление предупреждений анализатора в проектах Unreal Engine»).

Данные улучшения позволяют использовать механизм подавления проектов У? на постоянной основе.

Алгоритм использования механизма подавления проектов УП теперь выглядит так:

  • получить отчет по проекту УП одним из способов, описанных в разделе документация (раздел «Проверка проектов»);
  • используя PVS-Studio_Cmd.exe в режиме SuppressOnly , подавить все сообщения из полученного отчета;
  • при следующем анализе фильтровать сообщения из нового отчета, используя ранее полученный файл подавления и режим ФильтрИзПодавить в PVS-Studio_Cmd.exe.


Использование механизма подавления сообщений анализатора для проектов Unreal Engine в плагинах Visual Studio и JetBrains Rider.

Возможность подавления сообщений PVS-Studio для проектов UE была добавлена в плагины для Visual Studio и JetBrains Rider начиная с версии 7.17. Первое, что вам нужно сделать, это добавить файл подавления уровня решения.

Майкрософт Визуал Студия В Visual Studio для этого нужно щелкнуть правой кнопкой мыши по решению в контекстном меню Solution Explorer и создать новый файл подавления, выбрав Добавить > Новый элемент. > PVS-Studio Suppression File:

Базовый уровень Unreal или улучшения PVS-Studio для проектов Unreal Engine

Далее, чтобы подавить все сообщения, необходимо в окне с результатами анализа нажать кнопку «Подавить все сообщения» (это будет работать, если для сборки проектов UE включена автозагрузка логов):

Базовый уровень Unreal или улучшения PVS-Studio для проектов Unreal Engine

С помощью контекстного меню можно подавить только выбранные сообщения:

Базовый уровень Unreal или улучшения PVS-Studio для проектов Unreal Engine

Список всех подавленных файлов, которые используются для открытого в Visual Studio проекта/решения, можно просмотреть в специальном окне Расширения > PVS-Studio > Подавить сообщения:

Базовый уровень Unreal или улучшения PVS-Studio для проектов Unreal Engine

В этом окне есть несколько кнопок:

  • Подавить все – подавляет все сообщения в окне результатов анализа;
  • Подавить фильтруемые – подавляет только отфильтрованные сообщения;
  • Отменить подавление из выбранных – позволяет удалить подавленные файлы, выбранные в окне.

    В этом случае все сообщения из удаленных файлов подавления появятся в таблице с результатами анализа.

JetBrains Райдер Плагин для Rider более новый и тоже имеет другой механизм взаимодействия с ядром анализатора PVS-Studio. Из-за этого на данный момент (релиз 7.17) возможно только подавление всех сообщений, полученных в ходе анализа проекта УП.

Для этого в окне с результатами анализа, аналогично Visual Studio, есть кнопка «Подавить все сообщения»:

Базовый уровень Unreal или улучшения PVS-Studio для проектов Unreal Engine



Совместное использование новых базовых возможностей для проектов UE в CI и Visual Studio.

Учитывая все описанные выше улучшения в механизме baselining для проектов UE, теперь вы можете быстро интегрировать PVS-Studio в новый проект, настроить его автоматическую ежедневную проверку в CI и одновременно постепенно разобраться с подавленными предупреждениями в Visual Studio. Это будет выглядеть примерно так:
  • Интегрировав анализатор PVS-Studio в новый проект УП, вы получите первый отчет анализатора.

  • Далее вы подавите все обнаруженные предупреждения через PVS-Studio_Cmd.exe в SuppressOnly или через интерфейс плагина PVS-Studio для IDE. При подавлении всех предупреждений в IDE необходимо добавить файл подавления решения, в который будут записаны все подавленные предупреждения.

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

  • Вы передаете этот файл подавления в систему контроля версий или сохраняете его любым удобным для вас способом.

  • Следующий шаг — настройка задачи в CI, которая запускает анализ проекта с помощью PVS-Studio и фильтрует предупреждения из полученного отчета.

    При фильтрации используется ранее полученный файл подавления.

    Фильтрация происходит с помощью PVS-Studio_Cmd.exe в режиме ФильтрИзПодавить .

    В результате выполнения задачи вы получаете отчет с предупреждениями только для нового или измененного кода.

  • После этого отчет отправляется членам команды с помощью утилиты BlameNotifier.exe .

  • Каждый участник команды корректирует код на основании полученного отчета.

  • Ваша команда также может постепенно разобраться с подавленными сообщениями.

    Для этого необходимо включить подавление предупреждений в Visual Studio. После обработки подавленного предупреждения вы удаляете его из файла подавления и фиксируете изменение, чтобы это сообщение не мешало в будущем фильтрованию последующих отчетов анализатора с использованием файла подавления.

  • Помимо удаления, в файл подавления также можно добавлять новые предупреждения с помощью интерфейса плагина PVS-Studio для Visual Studio или через PVS-Studio_Cmd.exe в файле SuppressOnly с аргументом «-u», указывающим путь к ранее созданному файлу подавления.

    Таким образом можно отложить обработку предупреждений (чем не советую злоупотреблять), и при этом они не будут мешать отчету анализатора.



Заключение

Описанные улучшения в механизме базовой линии предупреждений повысили удобство использования статического анализатора PVS-Studio при работе с проектами Unreal Engine. Теперь будет гораздо проще внедрить анализатор в существующие проекты и использовать PVS-Studio на на регулярной основе при работе с проектами UE как в IDE, так и в CI/CD. Вы можете убедиться в этом сами, запросив пробную версию лицензия .

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

Базовый анализ Unreal: улучшения PVS-Studio для проектов Unreal Engine .

Теги: #Разработка игр #gamedev #статический анализ кода #pvs-studio #unreal engine #статический анализ #pvs #статический анализ кода #статический анализ #unrealengine

Вместе с данным постом часто просматривают: