Как запустить PVS-Studio Java


Статический анализатор кода PVS-Studio Java состоит из 2-х основных частей: ядра, выполняющего анализ и плагинов для интеграции в сборочные системы и IDE.

Плагины получают структуру проекта (наборы исходных файлов и classpath), после чего передают эту информацию в ядро. Кроме того, плагины отвечают за развёртывание ядра для анализа - оно будет автоматически скачано при первом запуске.

Анализатор имеет несколько различных способов интеграции в проект.

Системные требования

  • Операционная система: Windows, Linux, macOS;
  • Минимальная версия Java для запуска анализатора: Java 8 (64-битная). Примечание: Анализируемый проект может использовать любую версию Java;
  • Минимальная версия IntelliJ IDEA: 2017.2 (опционально);

Плагин для Maven

Для проектов со сборочной системой Maven можно воспользоваться плагином pvsstudio-maven-plugin. Для этого необходимо добавить следующее в файл pom.xml:

<pluginRepositories>
  <pluginRepository>
    <id>pvsstudio-maven-repo</id>
    <url>http://files.viva64.com/java/pvsstudio-maven-repository/</url>
  </pluginRepository>
</pluginRepositories>
<build>
  <plugins>
    <plugin>
      <groupId>com.pvsstudio</groupId>
      <artifactId>pvsstudio-maven-plugin</artifactId>
      <version>7.04.34029</version>
      <configuration>
        <analyzer>
          <outputType>text</outputType>
          <outputFile>path/to/output.txt</outputFile>
        </analyzer>
      </configuration>
    </plugin>
  </plugins>
</build>

После этого можно запустить анализ:

$ mvn pvsstudio:pvsAnalyze

Кроме того, анализ можно включить в цикл сборки проекта, добавив элемент execution:

<plugin>
  <groupId>com.pvsstudio</groupId>
  <artifactId>pvsstudio-maven-plugin</artifactId>
  <version>7.04.34029</version>
  <executions>
    <execution>
      <phase>compile</phase>
      <goals>
        <goal>pvsAnalyze</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Ввод лицензии

Чтобы ввести данные лицензии можно воспользоваться следующей командой:

mvn pvsstudio:pvsCredentials "-Dpvsstudio.username=USR" "-Dpvsstudio.serial=KEY"

После этого информация о лицензии будет сохранена в %APPDATA%/PVS-Studio-Java/PVS-Studio.lic в ОС Windows или в ~/.config/PVS-Studio-Java/PVS-Studio.lic в macOS и Linux.

Конфигурация

В блоке <analyzer> производится настройка анализатора. Ниже представлен список настроек анализатора.

  • <outputFile>PATH</outputFile> - путь до файла с отчетом анализатора. Значение по умолчанию: ${basedir}/PVS-Studio. Примечание: для отчета в формате 'fullhtml' в outputFile необходимо указать директорию, в которой будет создана папка с именем 'fullhtml' с отчетом анализатора. Значение по умолчанию: ${basedir}/fullhtml;
  • <outputType>TYPE</outputType> - формат отчета анализатора (text, log, json, xml, tasklist, fullhtml, errorfile). Значение по умолчанию: json;
  • <threadsNum>NUMBER</threadsNum> - число потоков анализа. Значение по умолчанию: число доступных процессоров;
  • <sourceTreeRoot>PATH</sourceTreeRoot> - общий корневой путь до исходников, который будет использоваться для генерации отчёта анализатора с относительными путями до проверяемых исходных файлов. Значение по умолчанию отсутствует;
  • <enabledWarnings>V6XXX, ....</enabledWarnings> - список активных диагностик. При задании включённых диагностик, не указанные здесь будут отключены. Значение по умолчанию отсутствует. При отсутствии значения данного параметра все диагностики считаются включенными (если дополнительно не задан параметр disabledWarnings);
  • <disabledWarnings>V6XXX, ....</disabledWarnings> - список выключенных диагностик. При задании отключённых диагностик, не указанные здесь будут считаться включёнными. Значение по умолчанию отсутствует. При отсутствии данного параметра все диагностики считаются включёнными (если дополнительно не задан параметр enabledWarnings)
  • <exclude>PATH, ....</exclude> - список файлов и/или директорий, которые нужно исключить из анализа (абсолютные или относительные пути). Значение по умолчанию отсутствует. При отсутствии данного параметра будут проанализированы все файлы (если дополнительно не задан параметр analyzeOnly);
  • <analyzeOnly>PATH, ....</analyzeOnly> - список файлов и/или директорий, которые нужно проанализировать (абсолютные или относительный пути). Значение по умолчанию отсутствует. При отсутствии данного параметра будут проанализированы все файлы (если дополнительно не задан параметр exclude);
  • <suppressBase>PATH</suppressBase> - путь до suppress файла, содержащего подавленные сообщения анализатора, которые не будут выданы в отчёте об анализе. Добавить сообщения в suppress файл можно через интерфейс PVS-Studio IDE плагина для IntelliJ IDEA. Значение по умолчанию: ${basedir}/.PVS-Studio/suppress_base.json;
  • <failOnWarnings>BOOLEAN</failOnWarnings> - прерывать ли сборку, если анализатор выдал какое-либо предупреждение. Значение по умолчанию: false;
  • <incremental>BOOLEAN</incremental> - запускать ли анализ инкрементально (в этом режиме анализируются только изменившиеся файлы). Значение по умолчанию: false;
  • <forceRebuild>BOOLEAN</forceRebuild> - флаг, позволяющий принудительно перестроить целиком закэшированную метамодель программы, содержащую информацию о её структуре и типах данных. Значение по умолчанию: false.
  • <disableCache>BOOLEAN</disableCache> - флаг, позволяющий отключить кэширование метамодели программы. Значение по умолчанию: false;
  • <timeout>NUMBER</timeout> - таймаут анализа одного файла (в минутах). Значение по умолчанию: 10;
  • <verbose>BOOLEAN</verbose> - сохранять ли временные файлы анализатора (например json со структурой анализируемого проекта). Значение по умолчанию: false;
  • <javaPath>PATH</javaPath> - путь до java интерпретатора, с которыми будет запускаться ядро анализатора. Значение по умолчанию: java из переменной окружения PATH;
  • <jvmArguments>FLAG, ....</jvmArguments> - дополнительные флаги JVM, с которыми будет запускаться ядро анализатора. Значение по умолчанию: -Xss64m;

Плагин для Gradle

Для проектов со сборочной системой Gradle можно воспользоваться плагином pvsstudio-gradle-plugin. Для этого необходимо добавить следующее в файл build.gradle:

buildscript {
  repositories {
    mavenCentral()
    maven {
      url uri('http://files.viva64.com/java/pvsstudio-maven-repository/')
    }
  }
  dependencies {
    classpath group: 'com.pvsstudio',
              name: 'pvsstudio-gradle-plugin',
              version: '7.04.34029'
  }
}
apply plugin: com.pvsstudio.PvsStudioGradlePlugin
pvsstudio {
  outputType = 'text'
  outputFile = 'path/to/output.txt'
}

После этого можно запустить анализ:

$ ./gradlew pvsAnalyze

Ввод лицензии

Чтобы ввести данные лицензии можно воспользоваться следующей командой:

./gradlew pvsCredentials "-Ppvsstudio.username=USR" "-Ppvsstudio.serial=KEY"

После этого информация о лицензии будет сохранена в %APPDATA%/PVS-Studio-Java/PVS-Studio.lic в ОС Windows или в ~/.config/PVS-Studio-Java/PVS-Studio.lic в macOS и Linux.

Конфигурация

В блоке "pvsstudio" производится настройка анализатора. Ниже представлен список настроек анализатора.

  • outputFile = "PATH" - путь до файла с отчетом анализатора. Значение по умолчанию: $projectDir/PVS-Studio. Примечание: для отчета в формате 'fullhtml' в outputFile необходимо указать директорию, в которой будет создана папка с именем 'fullhtml' с отчетом анализатора. Значение по умолчанию: $projectDir/fullhtml;
  • outputType = "TYPE" - формат отчета анализатора (text, log, json, xml, tasklist, fullhtml, errorfile). Значение по умолчанию: json;
  • threadsNum = NUMBER - число потоков анализа. Значение по умолчанию: число доступных процессоров;
  • sourceTreeRoot = "PATH" - общий корневой путь до исходников, который будет использоваться для генерации отчёта анализатора с относительными путями до проверяемых исходных файлов. Значение по умолчанию отсутствует;
  • enabledWarnings = ["V6XXX", ....] - список активных диагностик. При задании включённых диагностик, не указанные здесь будут отключены. Значение по умолчанию отсутствует. При отсутствии значения данного параметра все диагностики считаются включенными (если дополнительно не задан параметр disabledWarnings);
  • disabledWarnings = ["V6XXX", ....] - список выключенных диагностик. При задании отключённых диагностик, не указанные здесь будут считаться включёнными. Значение по умолчанию отсутствует. При отсутствии данного параметра все диагностики считаются включёнными (если дополнительно не задан параметр enabledWarnings);
  • exclude = ["PATH", ....] - список файлов и/или директорий, которые нужно исключить из анализа (абсолютные или относительные пути). Значение по умолчанию отсутствует. При отсутствии данного параметра будут проанализированы все файлы (если дополнительно не задан параметр analyzeOnly);
  • analyzeOnly = ["PATH", ....] - список файлов и/или директорий, которые нужно проанализировать (абсолютные или относительный пути). Значение по умолчанию отсутствует. При отсутствии данного параметра будут проанализированы все файлы (если дополнительно не задан параметр exclude);
  • suppressBase = "PATH" - путь до suppress файла, содержащего подавленные сообщения анализатора, которые не будут выданы в отчёте об анализе. Добавить сообщения в suppress файл можно через интерфейс PVS-Studio IDE плагина для IntelliJ IDEA. Значение по умолчанию: $projectDir/.PVS-Studio/suppress_base.json;
  • failOnWarnings = BOOLEAN - прерывать ли сборку если анализатор выдал какое-либо предупреждение. Значение по умолчанию: false;
  • incremental = BOOLEAN - запускать ли анализ инкрементально (в этом режиме анализируются только изменившиеся файлы). Значение по умолчанию: false;
  • forceRebuild = BOOLEAN - флаг, позволяющий принудительно перестроить целиком закэшированную метамодель программы, содержащую информацию о её структуре и типах данных. Значение по умолчанию: false;
  • disableCache = BOOLEAN - флаг, позволяющий отключить кэширование метамодели программы. Значение по умолчанию: false;
  • timeout = NUMBER - таймаут анализа одного файла (в минутах). Значение по умолчанию: 10;
  • verbose = BOOLEAN - сохранять ли временные файлы анализатора (например json со структурой анализируемого проекта). Значение по умолчанию: false;
  • javaPath = "PATH" - путь до java интерпретатора, с которыми будет запускаться ядро анализатора. Значение по умолчанию: java из переменной окружения PATH;
  • jvmArguments = ["FLAG", ....] - дополнительные флаги JVM, с которыми будет запускаться ядро анализатора. Значение по умолчанию: ["-Xss64m"];

Плагин для IntelliJ IDEA

Анализатор PVS-Studio Java можно также использовать в виде плагина к IntelliJ IDEA. В таком случае разбор структуры проекта производится средствами этой IDE, а плагин предоставляет удобный графический интерфейс для работы с анализатором.

Плагин PVS-Studio для IDEA можно установить из официального репозитория плагинов JetBrains или из репозитория на нашем сайте. Ещё один способ установки (включая ядро анализатора) - через установщик PVS-Studio для Windows, доступный на странице загрузки.

Ниже приведен порядок установки плагина из нашего репозитория.

1) File -> Settings -> Plugins

Picture 6

2) Manage Plugin Repositories

Picture 18

3) Add repository (http://files.viva64.com/java/pvsstudio-idea-plugins/updatePlugins.xml)

Picture 22

4) Install

Picture 23

После этого нужно ввести данные лицензии.

1) Analyze -> PVS-Studio -> Settings

Picture 25

2) Вкладка Registration:

Picture 27

Теперь можно запустить анализ текущего проекта:

Picture 29

Интеграция PVS-Studio с Continuous Integration системами и SonarQube

Любой из перечисленных способов интеграции анализатора в сборочную систему можно использовать для автоматизированного анализа в Continuous Integration системах. Это можно сделать в Jenkins, TeamCity и других, настроив автоматический запуск анализа и уведомление о найденных ошибках.

Также возможна интеграция с платформой непрерывного контроля качества SonarQube с помощью плагина PVS-Studio. Инструкция по настройке доступна на странице: "Интеграция результатов анализа PVS-Studio в SonarQube".

Использование ядра анализатора напрямую

В случае, если ни один из приведенных выше способов интеграции в проект не подходит, можно использовать ядро анализатора напрямую. Ядро анализатора можно установить через установщик PVS-Studio для Windows (доступный на странице загрузки) или скачать по ссылке: http://files.viva64.com/java/pvsstudio-cores/7.04.34029.zip

Анализатору для работы необходим набор исходных файлов (или директорий с исходными файлами) для анализа, а так же classpath.

Набор исходных файлов для анализа указывается с помощью флага -s, а classpath с помощью флага -e. Кроме того, с помощью флага --ext-file можно указать файл, в котором перечислены все вхождения в classpath, разделенные при помощи pathSeparator (разделитель ':' в Unix системах и ';' в Windows).

Все доступные флаги ядра можно просмотреть с помощью следующей команды:

java -jar pvs-studio.jar --help

Примеры быстрого запуска:

java -jar pvs-studio.jar -s A.java B.java C.java -e Lib1.jar Lib2.jar -j4 -o report.txt -O text

java -jar pvs-studio.jar -s src/main/java --ext-file classpath.txt -j4 -o report.txt -O text

Подавление сообщений анализатора

Имеется несколько способов подавления сообщений анализатора.

1. При помощи специальных комментариев:

void f() {
    int x = 01000; //-V6061
}

2. При помощи suppress файла

Создать suppress файл можно через интерфейс PVS-Studio IDE плагина для IntelliJ IDEA. Путь до suppress файла можно указать в качестве параметра maven или gradle плагина, а так же в качестве параметра при прямом запуске ядра анализатора.

Picture 35

При подавлении сообщения через IDEA, suppress файл будет создан в директории .PVS-Studio, расположенной в директории открытого в IDE проекта, с именем suppress_base.json;

3. При помощи аннотаций @SuppressWarnings(....)

Анализатор знает о некоторых аннотациях и может не выдавать предупреждения на код, который уже был размечен. Например:

@SuppressWarnings("OctalInteger")
void f() {
    int x = 01000;
}

Описание распространённых проблем и их решение

Возникает "GC overhead limit exceeded" или завершение анализа по таймауту

Проблему нехватки памяти можно решить увеличением доступного объема памяти и стека.

В плагине для Maven:

<jvmArguments>-Xmx4096m, -Xss256m</jvmArguments>

В плагине для Gradle:

jvmArguments = ["-Xmx4096m", "-Xss256m"]

В плагине для IntelliJ IDEA:

1) Analyze -> PVS-Studio -> Settings

2) Вкладка Environment -> JVM arguments

Picture 31

Обычно объема памяти по умолчанию может не хватать при анализе сгенерированного кода с большим количеством вложенных конструкций.

Возможно стоит исключить этот код из анализа (с помощью exclude), чтобы не тратить на него лишнее время.

Как изменить версию Java для запуска анализатора?

По умолчанию анализатор запускает ядро с java из переменной окружения PATH. Если необходимо запустить анализ с какой-то другой версией, ее можно указать вручную.

В плагине для Maven:

<javaPath>C:/Program Files/Java/jdk1.8.0_162/bin/java.exe</javaPath>

В плагине для Gradle:

javaPath = "C:/Program Files/Java/jdk1.8.0_162/bin/java.exe"

В плагине для IntelliJ IDEA:

1) Analyze -> PVS-Studio -> Settings

2) Вкладка Environment -> Java executable

Picture 33

Не удается запустить анализ (возникают ошибки V00X)

В случае если не удается запустить анализ, пожалуйста, напишите нам в поддержку (support@viva64.com) и приложите текстовые файлы из директории .PVS-Studio (находится в директории с проектом).


Найденные ошибки

Проверено проектов
354
Собрано ошибок
13 290

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;