Интеграция PVS-Studio Java в сборочную систему Gradle
- Интеграция плагина PVS-Studio в Gradle
- Запуск анализа
- Запуск анализа без доступа к сети
- Конфигурация
- Обновление PVS-Studio Java анализатора
Статический анализатор кода PVS-Studio Java состоит из 2-х основных частей: ядра, выполняющего анализ, и плагинов для интеграции в сборочные системы (Maven и Gradle) и IDE (IntelliJ IDEA и Android Studio).
Функции плагинов:
- предоставление удобного интерфейса для запуска и настройки анализатора;
- развёртывание в системе ядра анализатора;
- сбор и передача данных (наборы исходных файлов и classpath) о структуре проекта ядру анализатора.
Интеграция плагина PVS-Studio в Gradle
Для интеграции плагина при использовании Groovy DSL необходимо добавить следующий код в скрипт сборки build.gradle:
buildscript {
repositories {
mavenCentral()
maven {
url uri('https://cdn.pvs-studio.com/java/pvsstudio-maven-repository/')
}
}
dependencies {
classpath 'com.pvsstudio:pvsstudio-gradle-plugin:latest.release'
}
}
apply plugin: com.pvsstudio.PvsStudioGradlePlugin
pvsstudio {
outputType = 'text'
outputFile = '.PVS-Studio/report.txt'
analysisMode = ['GA', 'OWASP']
}
Для Kotlin DSL необходимо добавить следующий код в build.gradle.kts:
import com.pvsstudio.WarningGroup
buildscript {
repositories {
mavenCentral()
maven {
url = uri("https://cdn.pvs-studio.com/java/pvsstudio-maven-repository/")
}
}
dependencies {
classpath("com.pvsstudio:pvsstudio-gradle-plugin:latest.release")
}
}
apply<com.pvsstudio.PvsStudioGradlePlugin>()
extensions.configure<com.pvsstudio.AnalyzerConfig>("pvsstudio") {
outputType = "text"
outputFile = ".PVS-Studio/output.txt"
analysisMode = setOf(WarningGroup.GA, WarningGroup.OWASP)
}
Запуск анализа
Перед первым запуском анализа вам необходимо будет ввести лицензию. Как это сделать — можно узнать в этой документации.
Для запуска анализа выполните команду:
./gradlew pvsAnalyze
Обратите внимание: при анализе проекта плагин запускает ядро Java анализатора, которое по умолчанию использует версию java из переменной окружения PATH. Задать другую версию можно при помощи настройки плагина javaPath, подробное описание которой находится ниже в разделе Конфигурация.
Запуск анализа без доступа к сети
Для работы плагина нужно скачать его зависимости. Если вам нужно работать с плагином в системе без доступа в сеть, вы должны создать офлайн репозиторий c зависимостями плагина.
Для загрузки зависимостей и подготовки к офлайн использованию примените такую команду:
./gradlew build --refresh-dependencies
Запускать эту команду нужно из директории с файлом build.gradle (корневой директории проекта). В этом случае все необходимые зависимости для сборки и анализа проекта будут сохранены в стандартной папке локального репозитория:
- Windows:
%userprofile%/.gradle/caches/modules-2/files-2.1 - Linux/macOS:
~/.gradle/caches/modules-2/files-2.1.
Вы должны иметь подключение к сети во время запуска этой команды, чтобы зависимости могли загрузиться. Для последующей работы интернет-соединение уже не нужно.
В системе должно быть установлено ядро Java той же версии, что и плагин. Узнать, как установить ядро Java анализатора, можно в отдельной документации.
Использование анализатора в таком случае не отличается от обычного. Для того чтобы Gradle не начинал скачивать зависимости, используйте флаг --offline. Команда запуска анализа в офлайн режиме:
./gradlew pvsAnalyze –-offline
Конфигурация
Ниже представлен список настроек анализатора, которые могут быть указаны в блоке pvsstudio файла build.gradle (для Groovy DSL) или build.gradle.kts (для Kotlin DSL):
additionalWarnings = ["VXXXX", ....](Groovy) /setOf("VXXXX", ....)(Kotlin) — список диагностических правил, которые будут добавлены к анализу. Эта настройка имеет больший приоритет, чемenabledWarnings,disabledWarningsиanalysisMode. Значение по умолчанию отсутствует;analysisMode = ["GA", ....](Groovy) /setOf(WarningMode.GA, ....)(Kotlin) — список активных групп диагностических правил. Имеет меньший приоритет, чем настройки--enabled-warnings,--disabled-warningsи--additional-warnings. Значение по умолчанию:GA. Доступные группы:GA(правила общего назначения);-
OWASP(правила согласно OWASP Top Ten и OWASP ASVS).
analyzeOnly = ["PATH", ....](Groovy) /setOf("PATH", ....)(Kotlin) — список файлов и/или директорий, которые нужно проанализировать (абсолютные или относительный пути, которые будут раскрыты относительно каталога запуска). Файлы и/или директории, переданные в этом аргументе, объединяются в общий список с файлами и/или директориями из аргумента--analyze-only-list. При отсутствии значения для данной настройки будут проанализированы все файлы. Имеет меньший приоритет, чемexclude. Значение по умолчанию отсутствует;analyzeOnlyList = "PATH"(Groovy/Kotlin) — путь к текстовому файлу, содержащему список путей к файлам и/или каталогам для анализа (каждая запись должна быть на отдельной строке). Поддерживаются относительные (будут раскрыты относительно каталога запуска) и абсолютные пути. Файлы и/или директории, считанные из файла, указанного в этом аргументе, объединяются в общий список значений c аргументами изanalyzeOnly. Эта настройка имеет меньший приоритет, чемexclude. Значение по умолчанию отсутствует;disableCache = BOOLEAN(Groovy/Kotlin) — позволяет отключить кэширование метамодели программы. При отключённом кэше модель проекта не кэшируется и строится каждый раз заново. При отключении кэширования метамодели проекта также отключается инкрементальный режим анализа проекта (настройкаincremental). Значение по умолчанию:false;disabledWarnings = ["VXXXX", ....](Groovy) /setOf("VXXX", ....)(Kotlin) — список диагностических правил, которые не будут применены во время анализа. При отсутствии данной настройки все диагностические правила считаются включёнными. Имеет больший приоритет, чемenabledWarningsиanalysisMode, но меньший, чем--additionalWarnings. Значение по умолчанию отсутствует;enabledWarnings = ["VXXXX", ....](Groovy) /setOf("VXXXX", ....)(Kotlin) — список активных диагностических правил. Во время анализа будут использованы только перечисленные в этом списке диагностические правила. Эта настройка имеет меньший приоритет, чемdisabledWarningsиadditionalWarnings, но больший, чемanalysisMode. Значение по умолчанию отсутствует;exclude = ["PATH", ....](Groovy) /setOf("PATH", ....)(Kotlin) — список файлов и/или директорий, которые нужно исключить из анализа. Поддерживаются относительные (будут раскрыты относительно каталога запуска) и абсолютные пути. Эта настройка имеет больший приоритет, чемanalyzeOnlyиanalyzeOnlyList. Значение по умолчанию отсутствует. При перечислении нескольких файлов или директорий в качестве разделителя используется пробел;failOnWarnings = BOOLEAN(Groovy/Kotlin) — устанавливает ненулевой код возврата программы, если анализатор выдал хотя бы одно предупреждение. Такое поведение может быть удобным при интеграции в CI/CD. Значение по умолчанию:false;forceRebuild = BOOLEAN(Groovy/Kotlin) — позволяет принудительно перестроить целиком закэшированную метамодель программы. При использовании данного флага отключается инкрементальный режим анализа проекта (настройкаincremental). Значение по умолчанию:false;incremental = BOOLEAN(Groovy/Kotlin) — позволяет запустить анализ инкрементально. В этом режиме анализируются только изменившиеся или новые файлы. Значение по умолчанию:false;javaPath = "PATH"(Groovy/Kotlin) — задаёт путь до исполняемого файла java, с которым будет запускаться ядро анализатора. Эту настройку можно задать для всей системы в файлеglobal.json. Если не использоватьjavaPath, то PVS-Studio попытается использовать путь из переменной окруженияPATH;jvmArguments = ["FLAG", ....](Groovy) /setOf("FLAG", ....)(Kotlin) — дополнительные флаги JVM, с которыми будет запускаться ядро анализатора. Этот флаг позволяет настраивать JVM, которая будет запускать ядро Java анализатора. Возможно задать эту настройку для всей системы в файлеglobal.json. Значение по умолчанию:["-Xss64m"];licensePath = "PATH"(Groovy/Kotlin) — путь до файла с лицензией. Допустимые расширения файла:.xml,.lic. Значение по умолчанию:- Windows:
%APPDATA%/PVS-Studio/Settings.xml, - macOS и Linux:
~/.config/PVS-Studio/PVS-Studio.lic;
- Windows:
logging = "LEVEL"(Groovy/Kotlin) — уровень логирования при запуске анализа. При включении логирования в подпапке.PVS-Studio/logsотносительно директории текущего запуска Java анализатора будут созданы файлы логов для текущего запуска. Значение по умолчанию:OFF. Допустимые варианты значений:OFF;ERROR;WARN;INFO;DEBUG;TRACE;ALL.
outputFile = "PATH"(Groovy/Kotlin) — путь до файла с отчётом, куда будут записаны результаты анализа. Формат содержимого не зависит от расширения файла, указанного в данном параметре. Значение по умолчанию:$projectDir/PVS-Studio+ расширение формата из настройкиoutputType. Для отчёта в форматеfullhtmlнеобходимо указать директорию, в которой будет создана папка с именемfullhtml, содержащая файл отчёта анализатора (index.html). Значение по умолчанию:$projectDir/fullhtml. Внимание. Вместо использования настройкиoutputFileболее предпочтительным сценарием является использование консольных утилит PlogConverter (Windows) и plog-converter (Linux и macOS). Эти утилиты позволяют конвертировать отчёт анализатора в большее количество форматов (например, SARIF), а также предоставляют дополнительные возможности: фильтрация предупреждений из отчёта, преобразование путей в отчёте с абсолютных на относительные и наоборот, получение разницы между отчётами и др.;outputType = "TYPE"(Groovy/Kotlin) — формат, в котором будет представлен отчёт анализатора. Значение по умолчанию:json. Допустимые варианты значений:text;log;json;xml;tasklist;html;fullhtml;errorfile.
securityRelatedIssues = BOOLEAN(Groovy/Kotlin) — позволяет выделить дополнительной маркировкой в полеSASTпредупреждения, относящиеся к потенциальным проблемам безопасности и классифицируемые согласно ГОСТ Р 71207—2024. Значение по умолчанию:false;sourceTreeRoot = "PATH"(Groovy/Kotlin) — корневая часть пути, которую анализатор будет использовать при генерации относительных путей в отчёте для диагностических предупреждений. Значение по умолчанию отсутствует;suppressBase = "PATH"(Groovy/Kotlin) — путь до suppress-файла, содержащего подавленные предупреждения анализатора. Они не попадут в отчёт при следующих проверках проекта. Значение по умолчанию:./.PVS-Studio/suppress_base.json;threadsNum = NUMBER(Groovy/Kotlin) — позволяет задать число потоков, на которое будет распараллелен анализ. Можно задать эту настройку для всей системы в файлеglobal.json. Значение по умолчанию: число доступных логических ядер;timeout = NUMBER(Groovy/Kotlin) — таймаут анализа одного файла (в минутах). Эту настройку можно задать для всей системы в файлеglobal.json. Значение по умолчанию:10;compatibility = BOOLEAN(Groovy/Kotlin) — активирует диагностическое правило V6078, которое обнаруживает потенциальные проблемы совместимости API между выбранными версиями Java SE. Значение по умолчанию:false;excludePackages = ["PACK", ....](Groovy) /setOf("PACK", ....)(Kotlin) — пакеты, которые будут исключены из анализа совместимости. Используется диагностическим правилом V6078, если включена настройкаcompatibility;sourceJava = NUMBER(Groovy/Kotlin) — задаёт версию Java SE, на которой разработано приложение. Эта настройка используется диагностическим правилом V6078, если включена настройкаcompatibility. Минимальное значение:8. Максимальное значение:14;targetJava = NUMBER(Groovy/Kotlin) — задаёт версию Java SE, на совместимость с которой необходимо проверить API, используемое в приложении (sourceJava). Эта настройка используется диагностическим правилом V6078, если включена настройкаcompatibility. Минимальное значение:8. Максимальное значение:14;
Настройки могут быть переданы через командную строку в момент запуска анализа. Формат определения:
-Ppvsstudio.<nameSingleParam>=value
-Ppvsstudio.<nameMultipleParam>=value1;value2;value3
Пример:
./gradlew pvsAnalyze -Ppvsstudio.outputType=text
-Ppvsstudio.outputFile=.PVS-Studio/report.txt
-Ppvsstudio.disabledWarnings=V6001;V6002;V6003
Обратите внимание, что параметры, явно переданные в командной строке, имеют наивысший приоритет.
Как изменить версию Java для запуска анализатора
По умолчанию анализатор запускает ядро с java из переменной окружения PATH. Если необходимо запустить анализ с другой версией, её можно указать вручную. Для этого в настройке анализатора javaPath укажите путь до java из JDK. Версия этой JDK (версия языка Java) будет использована при анализе исходного кода проекта:
....
javaPath = "C:/Program Files/Java/jdk19.0.5/bin/java"
....
Обновление PVS-Studio Java анализатора
Благодаря использованию latest.release в качестве версии плагина в файле build.gradle или build.gradle.kts у вас всегда будет использоваться последняя версия PVS-Studio для анализа.
Использование прокси
При использовании прокси необходимо указать логин и пароль для корректной загрузки ядра анализатора.
Это можно сделать через аргументы:
-Dhttp.proxyUser,-Dhttp.proxyPassword-Dhttps.proxyUser,-Dhttps.proxyPassword-Djava.net.socks.username,-Djava.net.socks.password-Dftp.proxyUser,-Dftp.proxyPassword
Команда для запуска анализа через плагин для Gradle с прокси:
./gradlew pvsAnalyze "-Dhttp.proxyUser=USER" "-Dhttp.proxyPassword=PASS"