На протяжении многих лет команда PVS-Studio развивает одноименный статический анализатор. На данный момент анализатор представляет собой сложное программное решение и предоставляет возможность анализа таких языков программирования, как C, C++, C# и Java на платформах Windows, Linux и macOS. Совсем недавно в ряд поддерживаемых языков программирования была добавлена поддержка языка Java. Если анализатор PVS-Studio за долгие годы уже зарекомендовал себя среди C++ и C# разработчиков, то для Java-аудитории PVS-Studio еще новичок. Многие даже не слышали про анализатор, а кто слышал, тот мало знаком со всеми его возможностями. Поэтому в этой статье хотелось бы познакомить вас с PVS-Studio Java, рассказать о способах запуска и его возможностях.

Рисунок 2


Общие сведения


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

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

Также есть возможность запускать анализатор напрямую, перечислив исходники и 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>{VERSION_PVS_JAVA}</version>
      <configuration>
        <analyzer>
          <outputType>text</outputType>
          <outputFile>path/to/output.txt</outputFile>
          ....
        </analyzer>
      </configuration>
    </plugin>
  </plugins>
</build>

Перед тем, как запустить анализ, необходимо ввести лицензионные данные:

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.

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

$ mvn pvsstudio:pvsAnalyze

В блоке <analyzer> можно производить настройку анализатора. Список всех настроек можно посмотреть здесь.

Плагин для 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: '{VERSION_PVS_JAVA}'
  }
}

apply plugin: com.pvsstudio.PvsStudioGradlePlugin
pvsstudio {
  outputType = 'text'
  outputFile = 'path/to/output.txt'
  ....
}

Перед тем, как запустить анализ, необходимо ввести лицензионные данные:

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

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

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

$ ./gradlew pvsAnalyze

В блоке 'pvsstudio' можно производить настройку анализатора. Список всех настроек можно посмотреть здесь.

Плагин для IntelliJ IDEA


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

Плагин PVS-Studio для IDEA можно установить из:


После того, как Вы установили плагин, необходимо ввести лицензионные данные:

1) Analyze > PVS-Studio > Settings

Picture 26

2) Вкладка Registration:

Picture 28

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

Picture 30

Лицензирование


Анализатор PVS-Studio ориентирован на команды разработчиков и по сути является проприетарным B2B продуктом. Чтобы ознакомиться с возможностями анализатора, вы можете запросить триальный ключ.

Если вы развиваете открытые проекты, или, например, являетесь студентом, то вы можете воспользоваться одним из бесплатных вариантов лицензирования PVS-Studio.

Подавление ложных предупреждений


Для борьбы с ложными срабатываниями в анализаторе предусмотрен набор различных механизмов:

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

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

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

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

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

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

Заключение


То, что мы сейчас рассмотрели — только малая часть того, о чем можно было рассказать. Например, существует возможность интеграции с SonarQube и так далее. PVS-Studio Java — молодое направление, которое активно развивается:

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

Чтобы полностью изучить существующие возможности анализатора и в дальнейшем не упустить появление новых, читайте блог PVS-Studio.



Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Maxim Stefanov. Get to Know the PVS-Studio Static Analyzer for Java

Комментарии (39)


  1. kefirfromperm
    02.08.2019 13:33
    +3

    Было бы интересно узнать что в PVS-Studio есть, чего нет в анализаторе IDEA.


    1. Andrey2008
      02.08.2019 13:54
      -3

      Плохая идея сравнить IDEA и PVS-Studio, так как это инструменты разного типа. IDEA это productivity tool, а PVS-Studio это классический статический анализатор кода. PVS-Studio это подробная документация, различные варианты интеграции в CI, интеграция с SonarQube, классификация предупреждений согласно CWE, возможность генерации полных HTML отчётов (включающий код), механизм массового подавление предупреждений для внедрения инструмента в большие старые проекты и так далее.


      1. sshikov
        02.08.2019 18:54
        +2

        А никто не просил сравнивать IDEA целиков, просили сравнить ее анализатор. Это вполне сравнимые вещи (да, хотя бы и по возможности интеграции в CI например). Все что вы перечисляете — это вторичные показатели, первичные же — это число найденных анализатором проблем (в том числе ложных).


        1. Andrey2008
          03.08.2019 19:55

          Все что вы перечисляете — это вторичные показатели, первичные же — это число найденных анализатором проблем
          Не согласен, это вовсе не вторичные показатели, а часто как раз первичные. Если анализ неудобно использовать и трудоёмко внедрить в большой проект, то нет смысла обсуждать диагностики. Это не означает, что диагностики не важны. Однако, подходить вот так в лоб к сравнению, это плохая идея. К сожалению, более подробный ответ тянет на отдельную статью и думаю я со временем ей займусь. Спасибо, что подняли эту тему.

          P.S.: Почему мы не пишем о сравнении PVS-Studio с другими статическими анализаторами кода.


          1. eliduvid
            04.08.2019 00:30

            С другой стороны, вот я пользуюсь idea. Их встроенный анализ находит мои ошибки в процессе написания кода. Что именно мне может дать pvs?
            Мне кажется в такой формулировке этот вопрос имеет смысл.


            1. igormich88
              04.08.2019 01:47
              +1

              Поделюсь своим небольшим опытом: такую ошибку idea не видит, а pvs увидел:

              int[] arr = new int[4];
              for (int i = 0; i < 5; i++) {
                arr[i] = i;
              }


              1. sshikov
                04.08.2019 09:00

                Я бы заменил этот цикл стримом (если это Java 8). Ну или другой конструкцией, где такие и похожие ошибки вообще сделать нельзя. К сожалению, такие вещи пока не видит ни один анализатор, хотя идея и пытается подсказывать что-то (но обычно довольно бесполезные вещи, типа «замените вот эту лямбду ссылкой на метод» — а я предпочитаю именно наоборот).


                1. igormich88
                  04.08.2019 12:07

                  такие вещи пока не видит ни один анализатор
                  Не совсем понял смысл фразы — как раз PVS это видит v557 Array overrun is possible. (Примера для Java сходу не нашёл).
                  PS: Сам я перешёл на котлин в котором такую ошибку сложнее сделать.
                  val arr = IntArray(4)
                  for(i in arr.indices) {
                      arr[i] = i
                  }


                  1. sshikov
                    04.08.2019 14:17

                    В смысле — анализатор видит проблему, но не может предложить решение в виде замены на другую конструкцию. Массив — на стрим.


                    1. lokkersp
                      05.08.2019 09:29

                      вы тут немного смешиваете, анализатор находит потенциально проблемные места, не его задача предлагать решение проблемы. «Замена, на другую конструкцию» это уже рефакторинг, что как бы немного за пределами ответственности анализатора.


                      1. sshikov
                        05.08.2019 19:34

                        Ну в общем да. Но с другой стороны, IDEA например замены предлагает. И почему нет?


                    1. igormich88
                      05.08.2019 14:47

                      По моему это может сказаться на производительности, а во вторых как бы вы переписали цикл из примера выше на стрим?


                      1. sshikov
                        05.08.2019 19:37

                        На производительности — может конечно. Стримы тут не обязательны, хотя и возможны: IntStream.range(...) например. Речь как бы не о том, на что конкретно заменить — речь о том, что встроенный анализатор IDEA не просто ищет проблемы, а иногда и предлагает замены. Поэтому параметру отдельный анализатор без таких возможностей будет уступать.


            1. Andrey2008
              04.08.2019 11:02

              Что именно мне может дать pvs?
              Запустите и как раз увидите, что найдёт PVS-Studio, что ещё не находит IDEA.


              1. eliduvid
                05.08.2019 18:45

                Для этого стоило бы дать начальству понять зачем я пытаюсь протащить новый софт во внутреннюю сеть))


                На самом же деле пользователем идеи не нужно именно сравнение анализаторов, никто же не собирается менять ide. Им (нам) только нужно дать понять, что во всех этих телодвижениях есть профит. То есть, что ваше кунг-фу сможет подсветить какие-нибудь баги которые у нас ещё не подсвечены.


          1. sshikov
            04.08.2019 08:56

            >Если анализ неудобно использовать
            Ну, по этому показателю любой отдельный анализатор сливает встроенному в IDEA по определению. А если учесть автоисправлялку — то и подавно.

            Я вполне могу понять ваши мотивы не сравнивать, но мои мотивы как разработчика очень простые — если IDEA находит большую часть проблем, то зачастую мне невыгодно внедрять что-то еще, потому что это тоже работа, и она стоит денег и требует времени (возможно, при внедрении в CI — времени других людей). И если встроенный в IDE анализатор достаточно хорош — сразу возникает вопрос, а стоит ли внедрение чего-то еще усилий?


            1. Andrey2008
              04.08.2019 11:11

              Правильно я понимаю, что все ваши разработчики используют только IDEA, причём настроенную одинаковым образом?

              Если да, то это хорошо, и вы молодцы. Но не было ли, что кто-то по невнимательности/лени/незнанию, всё равно закладывал баг в систему контроля версий, который вы вдруг потом обнаруживали уже на своей машине благодаря подсветке в IDEA? Если такое было, то это повод всё равно думать про CI.

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


              1. sshikov
                04.08.2019 11:31
                +1

                Насчет все — ну тут ответ «почти». Остались одиночки на эклипсе, для которых есть сонар (и он в CI), и у них обычно другие роли, нежели писать код ежедневно.

                Что до аргументов за анализ в рамках CI, одинаковый для всех и обязательный — то я с ними заранее согласен. Как раз идеевский анализатор прикрутить к CI или очень сложно, или вообще нельзя. Да и у сонара в его текущем виде, как он у нас используется, на мой взгляд слишком много ложных, сложно отключаемых срабатываний. Условно — у нас в проекте есть параметры, которые называются passwordAlias, и это не пароль ни разу. И попробуйте объяснить сонару, что не надо ругаться на эти названия — проще отключить сонар ;)


                1. Andrey2008
                  04.08.2019 11:49

                  Добавьте PVS-Studio в SonarQube. Вам должно понравиться.


                1. EvgeniyRyzhkov
                  04.08.2019 13:38
                  +1

                  Общаешься с людьми на Хабре — у все все настроено, везде автоматически все работает, тестами все покрыто…

                  Вот только статей про ошибки в программах меньше не становится почему-то.


                  1. sshikov
                    04.08.2019 14:24

                    Лично я ничего такого не говорил. Вопрос был про идею, и в этом случае у нас ее реально 99% — но это лишь один проект, а даже например не отдел. И сонар с CI конечно тоже есть — но это не новость, я думаю это у многих.

                    Ну и потом, у нас вообще основной инструмент спарк, и покрыть приложение юнит тестами вообще почти не реально. А интеграционными очень сложно.

                    Статический анализ есть, но сонар пока не нашел у нас ничего серьезного — но это не значит, что этого серьезного не было.

                    Что же до реальных источников ошибок, то я могу сходу назвать один — это неопределенности во внешних условиях, в постановке задачи, и т.п. И во внешних по отношению к программе данных. Статический анализ это далеко не всегда может увидеть.


                1. Maccimo
                  04.08.2019 23:02

                  Как раз идеевский анализатор прикрутить к CI или очень сложно, или вообще нельзя.

                  Первый комментарий к статье «Запускаем инспекции IntelliJ IDEA на Jenkins» именно от вас, а говорите «нельзя».


  1. LeshaRB
    02.08.2019 14:00
    +4

    В статье рассказно, как регистрировать PVS-Studio…


  1. bestie
    02.08.2019 14:18
    +1

    Здравствуйте.
    Ожидается ли сравнение функциональности с ближайшим собратом ru.wikipedia.org/wiki/FindBugs?


    1. Andrey2008
      02.08.2019 14:30

      FindBugs умер много лет назад.


      1. ARosolko
        02.08.2019 14:56
        +2

        И на его место пришел SpotBugs


        1. Andrey2008
          03.08.2019 20:01

          Да, со SpotBugs можно сравниться. Но не хочется. Кстати, ошибки в нём мы находили.


          1. igormich88
            03.08.2019 21:37

            Можно один вопрос, ваш анализатор работает с исходным кодом, а SpotBugs (и FindBugs) с байткодом?


            1. Andrey2008
              03.08.2019 21:47

              Да, PVS-Studio работает с исходным кодом. FindBugs анализирует не исходники, а байт-код. Как я понимаю, SpotBugs, аналогично работает с байт-кодом.


  1. WD40
    02.08.2019 14:20

    А для Python PVS-Studio не планируется?


    1. Andrey2008
      02.08.2019 14:31

      Нет. Сейчас мы работаем над направлением MISRA и облаками.


  1. kagarich
    02.08.2019 18:29

    Многие даже не слышали про анализатор, а кто слышал, тот мало знаком со всеми его возможностями.

    В статье НЕ рассказано про возможнлсти анализатора. Предположим я не знаю нужен мне авто-анализатор, или проще и дальше ручками статанализ делать, как эта статья поможет ответить на этот вопрос?


    1. sshikov
      04.08.2019 09:05

      Ну, на самом деле были и другие статьи, так что просто возьмите да почитайте. Как раз с ответами на эти вопросы (ну, в какой-то степени). Я лично даже слегка удивился, когда появилась статья вот такая, с описанием базовых процессов, потому что про Java анализатор в общем-то давно уже известно, и примеры анализа уже были.


      1. Andrey2008
        04.08.2019 11:14

        статья вот такая, с описанием базовых процессов
        Эта статья принесла в несколько раз больше запросов триала, чем это происходит обычно после публикации статьи. :)


        1. sshikov
          04.08.2019 11:24

          Не, ну тут удивление скорее от того, что такую раньше не написали, потому что обзор Java анализатора уже был, и довольно таки давно.


  1. VAAKAraceGUM
    02.08.2019 20:18

    А в чем разница между созданием плагинов для IDEA и CLion/Rider если экосистема IDE одна? Когда будут плагины для указанных IDE?


    1. SvyatoslavMC
      03.08.2019 21:54

      Плагины вроде как совместимы, мы запускались в CLion. Большая разница в работе с проектными файлами. Ещё год назад API у CLion не был публичным, поэтому плагин для выпуска не готовился. Нам есть смысл доделать плагины для всех поддерживаемых языков, но по датам сказать не могу.


  1. sshikov
    04.08.2019 09:03

    Кстати, а что с поддержкой других языков? IDEA в какой-то степени работает с груви, котлином и скалой. Можно ли искать проблемы и в них тоже? Грубо говоря — можно ли на сегодня проверить что-то типа Apache Spark? И было бы очень интересно посмотреть на результаты проверки чего-то большого, и достаточно древнего, скажем Hadoop.

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


    1. Andrey2008
      04.08.2019 11:16

      Да, мы работаем только с исходным кодом. С одной стороны, это ограничивает возможности, с другой позволяет делать более интересные диагностики.