Пробуем статический анализатор PVS-Studio для Java

Привет, друзья. Думаю, все, кто читает Хабр, знают статьи с Единорогом с радугой. Собственно, это отличительный знак постов из блога PVS-Studio. Сегодня, прочитав очередную заметку (в этот раз про поиск багов в калькуляторе Windows), я решил и сам испробовать данный статический анализатор.

PVS-Studio

Собственно, про компанию PVS-Studio все, наверное, и так всё знают. Ведь Евгений (CEO и совладелец) и Андрей (CTO и совладелец) рассказывали об этом уже миллион раз. Например, один из последних классных рассказов случился в 230-м выпуске подкаста devzen — https://devzen.ru/episode-0230/.

Ещё мы все знаем, с чего начинался этот анализатор кода — с языка С++. Именно там PVS-Studio стал одним из лидеров, захватив нишу. Первенство постоянно доказываетя в статьях на хабре, где каждый раз находятся крутые баги в известных проектах, например, в Chrome.

Евгений и Андрей решили пойти дальше, пробуя другие языки кроме С++. На самом деле, если почитать хабр трёх летней давности, то там Андрей говорил, что на Java они не смотрят. Но, видимо, продавать статический анализатор так тяжало, что пришлось изменить этому принципу.

Как в кратце работает этот аназизатор? Согласно открым данным, из С++ реализации анализатора были выделены в отдельный проект все правила анализа. Таким образом, продукт состоит из двух больших модулей — из парсера, который строит некоторое AST, и движка правил, который содержит все эвристики, правила, исключения, и вот это всё. Собственно, ребята дописали парсер для Java, и таким образом появился анализатор и для этого языка.

Исходя из архитектуры PVS-Studio, можно ожидать, что перед нами довольно зрелый Java-анализатор. Ведь он базируется на давно зарекомендовавшем себя С++ анализаторе кода. К сожалению, пока это не так (по крайне мере, в моём случае), и об этом далее.

Начнем с интеграции PVS-Studio в Java-проект. Тут, на самом деле, всё очень круто. Вы просто читаете инструкцию, и выполняете шаги для Maven/Gradle. У меня в тестируемом проекте gradle, и всё завелось спустя 20 секунд. Инструкция — https://www.viva64.com/ru/m/0044/.

Коротко о том, где взять ключ лицензии. Путей несколько:

  • Вы можете взять бесплатно триальный ключ PVS-Studio на 7 дней. Форма, через которую робот вам пришлет триальный ключ, тут — https://www.viva64.com/ru/pvs-studio-download/
  • Если у вас Open-source продукт, то вы просто можете запросить ключ. Вроде бы, это рабочий вариант, но сам я не пробовал.
  • Если вы — какой-нибудь студент-исследователь, то можете добавить во все исходники вашего проекта специальную фразу (проверь мой код, пожалуйста). Тогда у вас тоже всё заработает. О таком способе рассказывал Евгений, сам я такое не видел.
  • Ну, и вы можете честно купить этот продукт. Начальная цена — от 1 миллиона рублей.

В общем, я получил свой триальный ключ по почте и запустил анализатор. В моем коде нашлось всего 3 типа ошибок, чему я супер сильно удивился (обычно, всякие findbugs, pmd, sonarqube, Checkstyle находят миллионы ошибок, и потом приходится часами чистить false positive ошибки).

  • Low: V6036 [CWE-457] The value from the uninitialized optional is used. Это предупреждение у меня вылетело везде, где я использовал на Optional вызов .get() без проверки существования объекта. Делал я это в тестах, поэтому точно знал, что этот объект существует. Но, формально, на это можно поругаться. IDEA тоже ругается. Но, конечно же, это не баг, в реальности.
  • Medium: V6022 Parameter ‘variable’ is not used inside method body. Ну, что же, да, грешен. Переменная не используется, а в сигнатуре объявлена. Когда код развивается годами, такое случается.
  • Medium: V6021 [CWE-563] Variable ‘variable’ is not used. Похоже на предыдущее — переменная не используется. В прекрасном golang код бы вообще не скомпилировался.

В общем, выглядит как-то не очень. Ни одного реального бага. Хотя, надо сказать, что я скормил в PVS-Studio небольшой проект. Но, anyway, хотелось бы найти хотя бы один баг.

Итоги. Пока я не купился на этот инструмент для языка Java (в Плюсах — всё круто). Будем смотреть, что произойдет с этим ститическим анализатором в будущем. Пока что, тратить деньги на него не собираюсь.

Категории: Программирование