Статический анализатор PVS-Studio постоянно развивается: улучшаются различные механизмы, происходит интеграция с игровыми движками, IDE, CI/CD и другими системами и сервисами. Благодаря этому несколько лет назад появилась возможность использования PVS-Studio для анализа Unreal Engine проектов. Однако один из важных механизмов PVS-Studio – подавление сообщений анализатора (baselining, отключение выдачи предупреждений на существующий код) — не работал с UE-проектами. Почему он не был реализован сразу, и как в итоге была решена эта задача – читайте далее.
Baselining в PVS-Studio — это механизм, позволяющий провести 'условную черту' для предупреждений анализатора, которые были выданы при анализе проекта. Анализатор использует эту 'черту' и показывает пользователю только те предупреждения, которые не отсечены данной 'чертой'.
Механизм подавления предупреждений реализован при помощи специальных suppress-файлов, в которых сохраняется информация о каждом подавленном сообщении анализатора. Эти файлы учитываются при последующих запусках анализатора, и подавленные предупреждения не попадают в результирующий отчёт.
На практике это позволяет получать в результате анализа только актуальные предупреждения, выданные для нового или изменённого кода. Особенно полезен данный механизм при внедрении PVS-Studio в существующий проект. В этом случае при первом анализе может быть выдано огромное количество предупреждений (обычно количество ошибок зависит от размера кодовой базы). Вместо того чтобы пытаться обработать их все сразу, вы можете просто подавить их. В результате при следующем анализе будут выданы только "свежие" предупреждения анализатора.
Вы всегда можете вернуться к подавленным сообщениям. В плагинах PVS-Studio для IDE также имеются возможности массового подавления и повторного отображения выбранных пользователем срабатываний анализатора.
Рекомендую также прочитать посвящённую описанной выше проблематике статью "Как внедрить статический анализатор кода в legacy проект и не демотивировать команду".
На данный момент имеется несколько вариантов проверки Unreal Engine проектов при помощи PVS-Studio. Одним из наиболее удобных для регулярного использования является плагин для Visual Studio. Он позволяет прямо в IDE:
От такого удобства UE-разработчика отделяет лишь пара несложных настроек:
После этого появится возможность анализа UE-проекта в Visual Studio:
Аналогичные возможности реализованы и в плагине PVS-Studio for Rider.
Так почему же при всех имеющихся возможностях PVS-Studio baselining сообщений анализатора для UE-проектов не был поддержан вплоть до релиза 7.16? Более того, в версии 7.16 доработки этого механизма были произведены только в command-line утилите PVS-Studio_Cmd.exe. И только в версии анализатора 7.17 baselining был реализован в плагинах для Visual Studio и JetBrains Rider.
Для ответа на этот вопрос необходимо поговорить об особенностях UE-проектов.
На первый взгляд может показаться, что для поддержки baselining-а в UE-проектах было достаточно переиспользовать уже имеющийся механизм. Увы, но не всё так просто. Давайте рассмотрим механизмы, которые используются при анализе в PVS-Studio (не только для UE-проектов):
Таким образом, значительные отличия UE-проектов не позволили переиспользовать механизм baselining-а не только в консольной утилите, но и плагинах для IDE. Также интеграция С++ ядра (PVS-Studio.exe) в UBT наложила дополнительные ограничения на анализ UE-проектов из PVS-Studio_Cmd.exe. Данные ограничения коснулись и плагинов для IDE, так как они взаимодействуют с этой консольной утилитой.
Однако части ограничений для IDE удалось избежать, а именно:
Посмотрим, какие изменения потребовалось внести в утилиту PVS-Studio_Cmd.exe, а также в код плагинов для Visual Studio и JetBrains Rider, чтобы поддержать работу механизма baselining-а с UE-проектами.
В релизе 7.16 был расширен механизм baselining-а в PVS-Studio_Cmd.exe. Во-первых, добавлена возможность фильтрации сообщений анализатора из отчёта (plog-файла) при помощи suppress-файла. Во-вторых, расширен режим подавления сообщений, который теперь можно использовать и с отчётами для UE-проектов. Эта доработка позволила использовать baselining в случаях, когда нет необходимости (или возможности) использования UI. Например, при интеграции PVS-Studio в различные CI/CD (Travis Ci, Circle CI, Gitlab, Azure).
Режим подавления сообщений напрямую из отчётов (plog-файлов) PVS-Studio уже существовал до описываемых доработок. Его суть в добавлении в suppress-файлы проекта/решения сообщений из отчётов анализатора без запуска анализа. Пример команды для подавления всех сообщений из отчёта:
PVS-Studio_Cmd.exe -t path/to/solution/file -a SuppressOnly -o path/to/report
-u path/to/suppress/file
Активируется данный режим при помощи флага '-a SuppressOnly'. Также имеется возможность указать в необязательном аргументе '-u' путь до suppress-файла, не относящегося к проекту. В результате suppress-файл будет (пере)записан по этому пути, и в него так же, как и в suppress-файлы проекта/решения, будут добавлены все сообщения из отчёта, переданного в аргументе '-o'.
Кроме этого, был добавлен режим фильтрации сообщений из отчёта анализатора. Отличается он от режима SuppressOnly тем, что создаёт отфильтрованный отчёт, на основе переданного в аргументе '-o'. В отфильтрованном отчёте остаются только те предупреждения, которые не были найдены в suppress-файлах решения, проектов и suppress-файла из аргумента '-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'.
Оба описанных выше режима добавляют дополнительные возможности для работы с отчётами анализатора, причём не только для UE-проектов. Однако и здесь всё оказалось не так просто, потому что механизм baselining-а не может создавать и использовать suppress-файлы уровня UE-проектов. Учитывая эту особенность, для работы baselining-а приходится либо добавлять suppress-файл уровня решения, либо передавать его в аргументе '-u' при использовании режимов SuppressOnly или FilterFromSuppress.
Более подробно об этих и других особенностях работы механизма baselining-а для UE-проектов можно узнать из документации (раздел "Подавление предупреждений анализатора в Unreal Engine проектах").
Данные доработки позволяют использовать механизм подавления для UE-проектов на постоянной основе. Алгоритм использования механизма подавления для UE-проектов теперь выглядит так:
В плагины для Visual Studio и JetBrains Rider возможность подавления сообщений PVS-Studio для UE-проектов была добавлена, начиная с версии 7.17. Первое, что необходимо сделать, – добавить suppress-файл уровня решения.
Microsoft Visual Studio
В Visual Studio для этого необходимо нажать правой кнопкой мыши на решении в контекстном меню Solution Explorer и создать новый suppress-файл при помощи Add > New Item... > PVS-Studio Suppression File:
Далее для подавления всех сообщений необходимо нажать кнопку 'Suppress All Messages' в окне с результатами анализа (это будет работать в случае, если для сборки UE-проектов задействована автоподгрузка логов):
Возможно подавлять только выбранные сообщения при помощи контекстного меню:
Просмотреть список всех suppress-файлов, которые используются для открытого в Visual Studio проекта/решения, возможно в специальном окне Extensions > PVS-Studio > Suppress Messages:
В этом окне имеется несколько кнопок:
JetBrains Rider
Плагин для Rider является более молодым, а также имеет другой механизм взаимодействия с ядром анализатора PVS-Studio. Из-за этого в нём на данный момент (релиз 7.17) возможно только подавить все сообщения, полученные при анализе UE-проекта. Для этого в окне с результатами анализа, аналогично с Visual Studio, имеется кнопка 'Suppress All Messages':
Учитывая все описанные выше доработки механизма baselining-а для UE-проектов, теперь можно быстро интегрировать PVS-Studio в новый проект, настроить его автоматическую ежедневную проверку в CI и одновременно постепенно разбираться с подавленными предупреждениями в Visual Studio.
Выглядеть это будет примерно так:
Описанные доработки механизма baselining-а предупреждений повысили удобство использования статического анализатора PVS-Studio при работе с Unreal Engine проектами. Теперь будет намного проще внедрять анализатор в существующие проекты и использовать PVS-Studio на регулярной основе при работе с UE-проектами как в IDE, так и в CI/CD. Вы сами можете убедиться в этом, запросив триальную лицензию.