Использование PVS-Studio в CMake-проектах
- Прежде чем начать
- Использование официальной интеграции
- Добавление CMake-модуля в проект
- Настройка CMake-модуля
- Запуск анализа
Помимо режима работы с compile_commands.json, работать с PVS-Studio в CMake можно с помощью официальной интеграции или специального CMake-модуля. Он позволяет вам интегрировать анализатор в проект на основе CMake более глубоким образом. Например, вы можете указать конкретные цели для анализа, чтобы не проверять весь проект полностью, а лишь те части, которые вам нужны.
Прежде чем начать
Убедитесь, что вы ввели лицензионный ключ, иначе анализ не заработает. О том, как это сделать, подробно написано здесь.
Использование официальной интеграции
Начиная с версии 4.3.0, CMake предлагает сценарий использования анализатора без compile_commands.json. Срабатывания анализатора PVS-Studio будут появляться в процессе компиляции проекта.
Чтобы включить анализ через официальную интеграцию, добавьте следующее правило в CMakeLists.txt:
set(CMAKE_<LANG>_PVS_STUDIO <EXECUTABLE> analyze -a "GA\;OP")
LANGможет принимать значенияCилиCXX;EXECUTABLE— путь до исполняемого файлаpvs-studio-analyzerна GNU/Linux илиCompilerCommandsAnalyzer.exeна Windows. CMake извлечёт его расположение изPATH, если до него указан не абсолютный путь.
Указанные после EXECUTABLE параметры будут переданы исполняемому файлу C++ анализатора pvs-studio-analyzer/CompilerCommandsAnalyzer.exe.
Использование этой интеграции накладывает ограничения на формат вывода результатов анализа — вам будет недоступна конвертация отчёта через
plog-converter, так как анализ этим способом осуществляется индивидуально для каждого файла и без сохранения результирующего отчёта PVS-Studio.
Поскольку срабатывания анализатора PVS-Studio являются частью журнала сборки, вы можете воспользоваться CTest для передачи отчёта в систему отслеживания результатов CDash.
Добавление CMake-модуля в проект
Альтернативный способ добавить анализ с помощью PVS-Studio в проект — это использовать CMake-модуль. Для его автоматической загрузки используйте FetchContent:
include(FetchContent)
FetchContent_Declare(
PVS_CMakeModule
GIT_REPOSITORY "https://github.com/viva64/pvs-studio-cmake-module.git"
GIT_TAG "master"
)
FetchContent_MakeAvailable(PVS_CMakeModule)
include("${pvs_cmakemodule_SOURCE_DIR}/PVS-Studio.cmake")
Этот код самостоятельно загрузит Git-репозиторий с модулем в генерируемую папку кэша и позволит интегрировать анализатор в ваш проект. Обратите внимание, что master — это самая свежая версия. Если у вас возникнут проблемы с ней, то попробуйте взять последний релизный тег текущей версии анализатора.
Вы также можете загрузить файл с модулем PVS-Studio.cmake самостоятельно, если вы не хотите иметь лишних зависимостей от FetchContent.
Пожалуйста, не забывайте обновлять модуль с выходом новой версии анализатора во избежание проблем в его работе. В параметре GIT_TAG также можно указать master-ветку, чтобы всегда использовать последнюю версию модуля.
Настройка CMake-модуля
Для запуска анализатора CMake-модуль добавляет отдельную цель для сборки. При запуске сборки этой цели на самом деле будет запущен анализ с параметрами, которые были указаны при добавлении этой цели. Чтобы добавить цель для анализа, нужно использовать команду pvs_studio_add_target. Например:
cmake_minimum_required(VERSION 3.5)
project(pvs-studio-cmake-example CXX)
add_executable(example main.cpp)
# Optional:
# include(FetchContent)
# FetchContent_Declare(....)
# FetchContent_MakeAvailable(....)
include(PVS-Studio.cmake)
pvs_studio_add_target(TARGET example.analyze ALL
OUTPUT FORMAT json
ANALYZE example
MODE GA:1,2
LOG target.err
ARGS -e /path/to/exclude-path)
Этот небольшой CMake-файл содержит одну цель для сборки исполняемого файла и одну цель для запуска анализа. Разберем параметры команды pvs_studio_add_target:
Опции целей
ALL— анализ будет запускаться автоматически при сборке целиall, т. е. будет работать при каждой сборке проекта;TARGET— название создаваемой цели для анализа. Чтобы запустить анализ, достаточно собрать эту цель;ANALYZE— цели, которые нужно проанализировать. Должны быть уникальны при параллельной сборке нескольких целей CMake-модулем. Чтобы также проанализировать зависимости этих целей, стоит добавить флагRECURSIVE;RECURSIVE— рекурсивно анализировать зависимости целей;COMPILE_COMMANDS— использоватьcompile_commands.jsonвместо указания целей в опцииANALYZE. Работает за счетCMAKE_EXPORT_COMPILE_COMMANDS, доступно только при использовании Makefile или Ninja генераторов.
Опции вывода
OUTPUT— печатать вывод анализатора в лог сборки;LOG— файл отчета. Если его не указывать, будет использоваться файлPVS-Studio.logв директории с CMake кэшем;FORMAT— формат отчета. В данном случаеjson— формат ошибок с поддержкой многофайловой навигации. Список доступных форматов можно найти здесь (раздел "Утилита Plog Converter"). Можно использовать несколько форматов (пример:FORMAT "gitlab,tasklist-verbose");MODE— включение групп диагностик и их уровней.
Опции анализа
PLATFORM— название платформы, доступные опции:win32,x64/win64,linux32,linux64,macos,arm(IAR Embedded Workbench), pic8 (MPLAB XC8),tms(Texas Instruments C6000);PREPROCESSOR— формат препроцессированного файла (clang/visualcpp/gcc);LICENSE— путь до .lic файла;CONFIG— путь до .cfg файла;CFG_TEXT— содержимое .cfg файла;SUPPRESS_BASE— путь до suppress-файла в формате.suppress.json;KEEP_COMBINED_PLOG— не удалять совмещенный файл.pvs.rawдля последующей обработки утилитойplog-converter.
Прочие опции
DEPENDS— дополнительные зависимости для цели;SOURCES— список исходных файлов для анализа;BIN— путь доpvs-studio-analyzer(macOS/Linux) илиCompilerCommandsAnalyzer.exe(Windows);CONVERTER— путь доplog-converter(macOS/Linux) илиHtmlGenerator.exe(Windows);C_FLAGS— дополнительные флаги для C компилятора;CXX_FLAGS— дополнительные флаги для C++ компилятора;ARGS— дополнительные аргументы дляpvs-studio-analyzer/CompilerCommandsAnalyzer.exe;CONVERTER_ARGS— дополнительные аргументы дляplog-converter/HtmlGenerator.exe.
Исключение файлов из анализа
Для исключения файлов из анализа можно воспользоваться опцией ARGS, передав пути через флаг -e (--exclude-path), как указано в примере выше. Вы можете задать абсолютные, относительные пути или маску поиска (glob). Учтите, что относительные пути будут раскрыты относительно каталога сборки. Такой подход позволяет, например, исключить из анализа сторонние библиотеки.
Запуск анализа
Для запуска анализа надо собрать цель, которая была добавлена в pvs_studio_add_target. Например, так выглядит запуск анализа для примера выше:
cmake --build <path-to-cache-dir> --target example.analyze
Перед запуском будут собраны все цели, указанные для анализа в параметре ANALYZE.
Здесь вы можете найти примеры интеграции PVS-Studio в CMake.