Знакомство со статическим анализатором PVS-Studio для Java

    На протяжении многих лет команда 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
    PVS-Studio
    Статический анализ кода для C, C++, C# и Java

    Комментарии 41

      +2
      Было бы интересно узнать что в PVS-Studio есть, чего нет в анализаторе IDEA.
        –2
        Плохая идея сравнить IDEA и PVS-Studio, так как это инструменты разного типа. IDEA это productivity tool, а PVS-Studio это классический статический анализатор кода. PVS-Studio это подробная документация, различные варианты интеграции в CI, интеграция с SonarQube, классификация предупреждений согласно CWE, возможность генерации полных HTML отчётов (включающий код), механизм массового подавление предупреждений для внедрения инструмента в большие старые проекты и так далее.
          +2
          А никто не просил сравнивать IDEA целиков, просили сравнить ее анализатор. Это вполне сравнимые вещи (да, хотя бы и по возможности интеграции в CI например). Все что вы перечисляете — это вторичные показатели, первичные же — это число найденных анализатором проблем (в том числе ложных).
            +1
            Все что вы перечисляете — это вторичные показатели, первичные же — это число найденных анализатором проблем
            Не согласен, это вовсе не вторичные показатели, а часто как раз первичные. Если анализ неудобно использовать и трудоёмко внедрить в большой проект, то нет смысла обсуждать диагностики. Это не означает, что диагностики не важны. Однако, подходить вот так в лоб к сравнению, это плохая идея. К сожалению, более подробный ответ тянет на отдельную статью и думаю я со временем ей займусь. Спасибо, что подняли эту тему.

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

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

                +2
                Поделюсь своим небольшим опытом: такую ошибку idea не видит, а pvs увидел:
                int[] arr = new int[4];
                for (int i = 0; i < 5; i++) {
                  arr[i] = i;
                }
                  0
                  Я бы заменил этот цикл стримом (если это Java 8). Ну или другой конструкцией, где такие и похожие ошибки вообще сделать нельзя. К сожалению, такие вещи пока не видит ни один анализатор, хотя идея и пытается подсказывать что-то (но обычно довольно бесполезные вещи, типа «замените вот эту лямбду ссылкой на метод» — а я предпочитаю именно наоборот).
                    0
                    такие вещи пока не видит ни один анализатор
                    Не совсем понял смысл фразы — как раз PVS это видит v557 Array overrun is possible. (Примера для Java сходу не нашёл).
                    PS: Сам я перешёл на котлин в котором такую ошибку сложнее сделать.
                    val arr = IntArray(4)
                    for(i in arr.indices) {
                        arr[i] = i
                    }
                      0
                      В смысле — анализатор видит проблему, но не может предложить решение в виде замены на другую конструкцию. Массив — на стрим.
                        0
                        вы тут немного смешиваете, анализатор находит потенциально проблемные места, не его задача предлагать решение проблемы. «Замена, на другую конструкцию» это уже рефакторинг, что как бы немного за пределами ответственности анализатора.
                          0
                          Ну в общем да. Но с другой стороны, IDEA например замены предлагает. И почему нет?
                          0
                          По моему это может сказаться на производительности, а во вторых как бы вы переписали цикл из примера выше на стрим?
                            0
                            На производительности — может конечно. Стримы тут не обязательны, хотя и возможны: IntStream.range(...) например. Речь как бы не о том, на что конкретно заменить — речь о том, что встроенный анализатор IDEA не просто ищет проблемы, а иногда и предлагает замены. Поэтому параметру отдельный анализатор без таких возможностей будет уступать.
                    0
                    Что именно мне может дать pvs?
                    Запустите и как раз увидите, что найдёт PVS-Studio, что ещё не находит IDEA.
                      0

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


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

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

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

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

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

                        Что до аргументов за анализ в рамках CI, одинаковый для всех и обязательный — то я с ними заранее согласен. Как раз идеевский анализатор прикрутить к CI или очень сложно, или вообще нельзя. Да и у сонара в его текущем виде, как он у нас используется, на мой взгляд слишком много ложных, сложно отключаемых срабатываний. Условно — у нас в проекте есть параметры, которые называются passwordAlias, и это не пароль ни разу. И попробуйте объяснить сонару, что не надо ругаться на эти названия — проще отключить сонар ;)
                          0
                          Добавьте PVS-Studio в SonarQube. Вам должно понравиться.
                            +2
                            Общаешься с людьми на Хабре — у все все настроено, везде автоматически все работает, тестами все покрыто…

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

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

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

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

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

                  +4
                  В статье рассказно, как регистрировать PVS-Studio…
                    0
                    Здравствуйте.
                    Ожидается ли сравнение функциональности с ближайшим собратом ru.wikipedia.org/wiki/FindBugs?
                    0
                    А для Python PVS-Studio не планируется?
                      +2
                      Нет. Сейчас мы работаем над направлением MISRA и облаками.
                        –2
                        жаль, достаточно было бы просто базы по ошибкам в питоне а имея её можно самому за короткое время написать такой же анализатор
                      –2
                      Многие даже не слышали про анализатор, а кто слышал, тот мало знаком со всеми его возможностями.

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

                        0
                        Ну, на самом деле были и другие статьи, так что просто возьмите да почитайте. Как раз с ответами на эти вопросы (ну, в какой-то степени). Я лично даже слегка удивился, когда появилась статья вот такая, с описанием базовых процессов, потому что про Java анализатор в общем-то давно уже известно, и примеры анализа уже были.
                          +1
                          статья вот такая, с описанием базовых процессов
                          Эта статья принесла в несколько раз больше запросов триала, чем это происходит обычно после публикации статьи. :)
                            0
                            Не, ну тут удивление скорее от того, что такую раньше не написали, потому что обзор Java анализатора уже был, и довольно таки давно.
                        0
                        А в чем разница между созданием плагинов для IDEA и CLion/Rider если экосистема IDE одна? Когда будут плагины для указанных IDE?
                          0
                          Плагины вроде как совместимы, мы запускались в CLion. Большая разница в работе с проектными файлами. Ещё год назад API у CLion не был публичным, поэтому плагин для выпуска не готовился. Нам есть смысл доделать плагины для всех поддерживаемых языков, но по датам сказать не могу.
                          0
                          Кстати, а что с поддержкой других языков? IDEA в какой-то степени работает с груви, котлином и скалой. Можно ли искать проблемы и в них тоже? Грубо говоря — можно ли на сегодня проверить что-то типа Apache Spark? И было бы очень интересно посмотреть на результаты проверки чего-то большого, и достаточно древнего, скажем Hadoop.

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

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое