На протяжении многих лет команда PVS-Studio развивает одноименный статический анализатор. На данный момент анализатор представляет собой сложное программное решение и предоставляет возможность анализа таких языков программирования, как C, C++, C# и Java на платформах Windows, Linux и macOS. Совсем недавно в ряд поддерживаемых языков программирования была добавлена поддержка языка Java. Если анализатор PVS-Studio за долгие годы уже зарекомендовал себя среди C++ и C# разработчиков, то для Java-аудитории PVS-Studio еще новичок. Многие даже не слышали про анализатор, а кто слышал, тот мало знаком со всеми его возможностями. Поэтому в этой статье хотелось бы познакомить вас с PVS-Studio Java, рассказать о способах запуска и его возможностях.
Статический анализатор кода PVS-Studio Java состоит из двух основных частей: ядра, выполняющего анализ, и плагинов для интеграции в сборочные системы (Gradle, Maven) и IDE (IntelliJ IDEA).
Плагины получают структуру проекта (наборы исходных файлов и classpath), после чего передают эту информацию в ядро. Кроме того, плагины отвечают за развёртывание ядра для анализа — оно будет автоматически скачано при первом запуске.
Также есть возможность запускать анализатор напрямую, перечислив исходники и classpath.
Анализ можно проводить, если ваш компьютер удовлетворяет следующим системным требованиям:
Если проект, над которым Вы работаете, основан на сборочной системе Maven, то можно воспользоваться плагином pvsstudio-maven-plugin. Для этого необходимо добавить в проектный файл pom.xml следующее:
Перед тем, как запустить анализ, необходимо ввести лицензионные данные:
После этого информация о лицензии будет сохранена в %APPDATA%/PVS-Studio-Java/PVS-Studio.lic в ОС Windows или в ~/.config/PVS-Studio-Java/PVS-Studio.lic в macOS и Linux.
После этого можно запустить анализ:
В блоке <analyzer> можно производить настройку анализатора. Список всех настроек можно посмотреть здесь.
Если проект, над которым Вы работаете, основан на сборочной системе Gradle, то можно воспользоваться плагином pvsstudio-gradle-plugin. Для этого необходимо добавить в проектный файл build.gradle следующее:
Перед тем, как запустить анализ, необходимо ввести лицензионные данные:
После этого информация о лицензии, также, как и с Maven плагином, будет сохранена в %APPDATA%/PVS-Studio-Java/PVS-Studio.lic в ОС Windows или в ~/.config/PVS-Studio-Java/PVS-Studio.lic в macOS и Linux.
После этого можно запустить анализ:
В блоке 'pvsstudio' можно производить настройку анализатора. Список всех настроек можно посмотреть здесь.
Анализатор PVS-Studio Java можно также использовать в виде плагина к IntelliJ IDEA. В таком случае разбор структуры проекта производится средствами этой IDE, а плагин предоставляет удобный графический интерфейс для работы с анализатором.
Плагин PVS-Studio для IDEA можно установить из:
После того, как Вы установили плагин, необходимо ввести лицензионные данные:
1) Analyze > PVS-Studio > Settings
2) Вкладка Registration:
Теперь можно запустить анализ текущего проекта:
Анализатор PVS-Studio ориентирован на команды разработчиков и по сути является проприетарным B2B продуктом. Чтобы ознакомиться с возможностями анализатора, вы можете запросить триальный ключ.
Если вы развиваете открытые проекты, или, например, являетесь студентом, то вы можете воспользоваться одним из бесплатных вариантов лицензирования PVS-Studio.
Для борьбы с ложными срабатываниями в анализаторе предусмотрен набор различных механизмов:
1. При помощи специальных комментариев в коде:
2. При помощи suppress файла.
3. При помощи аннотаций @SuppressWarnings(....)
Анализатор знает о некоторых аннотациях и может не выдавать предупреждения на код, который уже был размечен. Например:
То, что мы сейчас рассмотрели — только малая часть того, о чем можно было рассказать. Например, существует возможность интеграции с SonarQube и так далее. PVS-Studio Java — молодое направление, которое активно развивается:
Чтобы полностью изучить существующие возможности анализатора и в дальнейшем не упустить появление новых, читайте блог PVS-Studio.
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Maxim Stefanov. Get to Know the PVS-Studio Static Analyzer for Java
Общие сведения
Статический анализатор кода 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 можно установить из:
- официального репозитория плагинов JetBrains;
- из репозитория на сайте viva64.com;
- через установщик PVS-Studio для Windows, доступный на странице загрузки.
После того, как Вы установили плагин, необходимо ввести лицензионные данные:
1) Analyze > PVS-Studio > Settings
2) Вкладка Registration:
Теперь можно запустить анализ текущего проекта:
Лицензирование
Анализатор 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
kefirfromperm
Было бы интересно узнать что в PVS-Studio есть, чего нет в анализаторе IDEA.
Andrey2008
Плохая идея сравнить IDEA и PVS-Studio, так как это инструменты разного типа. IDEA это productivity tool, а PVS-Studio это классический статический анализатор кода. PVS-Studio это подробная документация, различные варианты интеграции в CI, интеграция с SonarQube, классификация предупреждений согласно CWE, возможность генерации полных HTML отчётов (включающий код), механизм массового подавление предупреждений для внедрения инструмента в большие старые проекты и так далее.
sshikov
А никто не просил сравнивать IDEA целиков, просили сравнить ее анализатор. Это вполне сравнимые вещи (да, хотя бы и по возможности интеграции в CI например). Все что вы перечисляете — это вторичные показатели, первичные же — это число найденных анализатором проблем (в том числе ложных).
Andrey2008
P.S.: Почему мы не пишем о сравнении PVS-Studio с другими статическими анализаторами кода.
eliduvid
С другой стороны, вот я пользуюсь idea. Их встроенный анализ находит мои ошибки в процессе написания кода. Что именно мне может дать pvs?
Мне кажется в такой формулировке этот вопрос имеет смысл.
igormich88
Поделюсь своим небольшим опытом: такую ошибку idea не видит, а pvs увидел:
sshikov
Я бы заменил этот цикл стримом (если это Java 8). Ну или другой конструкцией, где такие и похожие ошибки вообще сделать нельзя. К сожалению, такие вещи пока не видит ни один анализатор, хотя идея и пытается подсказывать что-то (но обычно довольно бесполезные вещи, типа «замените вот эту лямбду ссылкой на метод» — а я предпочитаю именно наоборот).
igormich88
sshikov
В смысле — анализатор видит проблему, но не может предложить решение в виде замены на другую конструкцию. Массив — на стрим.
lokkersp
вы тут немного смешиваете, анализатор находит потенциально проблемные места, не его задача предлагать решение проблемы. «Замена, на другую конструкцию» это уже рефакторинг, что как бы немного за пределами ответственности анализатора.
sshikov
Ну в общем да. Но с другой стороны, IDEA например замены предлагает. И почему нет?
igormich88
По моему это может сказаться на производительности, а во вторых как бы вы переписали цикл из примера выше на стрим?
sshikov
На производительности — может конечно. Стримы тут не обязательны, хотя и возможны: IntStream.range(...) например. Речь как бы не о том, на что конкретно заменить — речь о том, что встроенный анализатор IDEA не просто ищет проблемы, а иногда и предлагает замены. Поэтому параметру отдельный анализатор без таких возможностей будет уступать.
Andrey2008
eliduvid
Для этого стоило бы дать начальству понять зачем я пытаюсь протащить новый софт во внутреннюю сеть))
На самом же деле пользователем идеи не нужно именно сравнение анализаторов, никто же не собирается менять ide. Им (нам) только нужно дать понять, что во всех этих телодвижениях есть профит. То есть, что ваше кунг-фу сможет подсветить какие-нибудь баги которые у нас ещё не подсвечены.
sshikov
>Если анализ неудобно использовать
Ну, по этому показателю любой отдельный анализатор сливает встроенному в IDEA по определению. А если учесть автоисправлялку — то и подавно.
Я вполне могу понять ваши мотивы не сравнивать, но мои мотивы как разработчика очень простые — если IDEA находит большую часть проблем, то зачастую мне невыгодно внедрять что-то еще, потому что это тоже работа, и она стоит денег и требует времени (возможно, при внедрении в CI — времени других людей). И если встроенный в IDE анализатор достаточно хорош — сразу возникает вопрос, а стоит ли внедрение чего-то еще усилий?
Andrey2008
Правильно я понимаю, что все ваши разработчики используют только IDEA, причём настроенную одинаковым образом?
Если да, то это хорошо, и вы молодцы. Но не было ли, что кто-то по невнимательности/лени/незнанию, всё равно закладывал баг в систему контроля версий, который вы вдруг потом обнаруживали уже на своей машине благодаря подсветке в IDEA? Если такое было, то это повод всё равно думать про CI.
Если нет, то вообще нельзя говорить, что в проекте используется статический анализ кода.
sshikov
Насчет все — ну тут ответ «почти». Остались одиночки на эклипсе, для которых есть сонар (и он в CI), и у них обычно другие роли, нежели писать код ежедневно.
Что до аргументов за анализ в рамках CI, одинаковый для всех и обязательный — то я с ними заранее согласен. Как раз идеевский анализатор прикрутить к CI или очень сложно, или вообще нельзя. Да и у сонара в его текущем виде, как он у нас используется, на мой взгляд слишком много ложных, сложно отключаемых срабатываний. Условно — у нас в проекте есть параметры, которые называются passwordAlias, и это не пароль ни разу. И попробуйте объяснить сонару, что не надо ругаться на эти названия — проще отключить сонар ;)
Andrey2008
Добавьте PVS-Studio в SonarQube. Вам должно понравиться.
EvgeniyRyzhkov
Общаешься с людьми на Хабре — у все все настроено, везде автоматически все работает, тестами все покрыто…
Вот только статей про ошибки в программах меньше не становится почему-то.
sshikov
Лично я ничего такого не говорил. Вопрос был про идею, и в этом случае у нас ее реально 99% — но это лишь один проект, а даже например не отдел. И сонар с CI конечно тоже есть — но это не новость, я думаю это у многих.
Ну и потом, у нас вообще основной инструмент спарк, и покрыть приложение юнит тестами вообще почти не реально. А интеграционными очень сложно.
Статический анализ есть, но сонар пока не нашел у нас ничего серьезного — но это не значит, что этого серьезного не было.
Что же до реальных источников ошибок, то я могу сходу назвать один — это неопределенности во внешних условиях, в постановке задачи, и т.п. И во внешних по отношению к программе данных. Статический анализ это далеко не всегда может увидеть.
Maccimo
Первый комментарий к статье «Запускаем инспекции IntelliJ IDEA на Jenkins» именно от вас, а говорите «нельзя».
LeshaRB
В статье рассказно, как регистрировать PVS-Studio…
bestie
Здравствуйте.
Ожидается ли сравнение функциональности с ближайшим собратом ru.wikipedia.org/wiki/FindBugs?
Andrey2008
FindBugs умер много лет назад.
ARosolko
И на его место пришел SpotBugs
Andrey2008
Да, со SpotBugs можно сравниться. Но не хочется. Кстати, ошибки в нём мы находили.
igormich88
Можно один вопрос, ваш анализатор работает с исходным кодом, а SpotBugs (и FindBugs) с байткодом?
Andrey2008
Да, PVS-Studio работает с исходным кодом. FindBugs анализирует не исходники, а байт-код. Как я понимаю, SpotBugs, аналогично работает с байт-кодом.
WD40
А для Python PVS-Studio не планируется?
Andrey2008
Нет. Сейчас мы работаем над направлением MISRA и облаками.
kagarich
В статье НЕ рассказано про возможнлсти анализатора. Предположим я не знаю нужен мне авто-анализатор, или проще и дальше ручками статанализ делать, как эта статья поможет ответить на этот вопрос?
sshikov
Ну, на самом деле были и другие статьи, так что просто возьмите да почитайте. Как раз с ответами на эти вопросы (ну, в какой-то степени). Я лично даже слегка удивился, когда появилась статья вот такая, с описанием базовых процессов, потому что про Java анализатор в общем-то давно уже известно, и примеры анализа уже были.
Andrey2008
sshikov
Не, ну тут удивление скорее от того, что такую раньше не написали, потому что обзор Java анализатора уже был, и довольно таки давно.
VAAKAraceGUM
А в чем разница между созданием плагинов для IDEA и CLion/Rider если экосистема IDE одна? Когда будут плагины для указанных IDE?
SvyatoslavMC
Плагины вроде как совместимы, мы запускались в CLion. Большая разница в работе с проектными файлами. Ещё год назад API у CLion не был публичным, поэтому плагин для выпуска не готовился. Нам есть смысл доделать плагины для всех поддерживаемых языков, но по датам сказать не могу.
sshikov
Кстати, а что с поддержкой других языков? IDEA в какой-то степени работает с груви, котлином и скалой. Можно ли искать проблемы и в них тоже? Грубо говоря — можно ли на сегодня проверить что-то типа Apache Spark? И было бы очень интересно посмотреть на результаты проверки чего-то большого, и достаточно древнего, скажем Hadoop.
P.S. Насколько я понимаю, из ответа на другой вопрос следует, что скорее всего нет, так как работа происходит с исходным кодом, а он тут сильно другой.
Andrey2008
Да, мы работаем только с исходным кодом. С одной стороны, это ограничивает возможности, с другой позволяет делать более интересные диагностики.