Пользователь Константин
Константин
36 уровень
Одесса

Введение в SpotBugs: инструмент для статического анализа кода

Статья из группы Random
Разработчики остро нуждаются в том, чтобы кто-то проверял их код. Особенно это касается начинающих разработчиков. Но иногда проверка чужого кода занимает очень много времени, да и занятие это скучноватое. Однако игнорировать этот аспект разработки нельзя, ведь он напрямую влияет на качество продукта, да и на качество вас как разработчика в целом. Введение в SpotBugs: инструмент для статического анализа кода - 1Поэтому ревью кода — обязательная часть разработки. Чтобы облегчить эту задачу, используются различные средства для статического анализа кода. Об одном из них мы поговорим сегодня. Для начала уточним один момент. У нас уже есть Java-компилятор, который проверяет код, так в чем же его отличие от статического анализа? Статический анализ проверяет байт-код Java (скомпилированные файлы с расширением .class) на наличие шаблонных ошибок, в то время как компилятор Java лишь проверяет исходный код на наличие синтаксических ошибок. Такие средства помогают находить плохие решения, неиспользуемый код, неэффективные решения, возможные ошибки и т.д. Они облегчают жизнь ревьюеров кода и позволяют отлавливать то, что они могут пропустить или не учесть при проверке. Если вы совсем новичок и ещё не работаете в компании на проекте, данные инструменты вам будут особенно полезны, так как они будут освещать недостатки вашего кода, и вы будете их подсознательно запоминать, чтобы в будущем не допускать повтора. Ну а впоследствии вы сами сможете стать крутым ревьюером, поскольку будете мгновенно замечать все недостатки кода. Сегодня проведем небольшой обзор статического анализатора SpotBugs.Введение в SpotBugs: инструмент для статического анализа кода - 2SpotBugs — это инструмент, который позволяет исследовать код для поиска возможных проблем. Он производит статический анализ, просматривая код, чтобы найти определенные антипаттерны, которые могут вызывать проблемы (например, низкую производительность). Инструмент, который выполняет эти проверки автоматически, при каждом изменении, спасет код от постепенного ухудшения. Если не настроить этот процесс, незаметно для всех, в какой-то момент может стать слишком поздно, ведь код будет содержать сотни предупреждений.
Для корректной работы SpotBugs необходимо использовать Java версии 8 и выше.
Данный инструмент называют преемником (наследником) общеизвестного статического анализатора FindBugs. SpotBugs можно в интеграции с:
  • Ant
  • Maven
  • Gradle
  • Eclipse
Также возможно использование через скачивание и установку двоичного дистрибутива. Мы с вами воспользуемся подключением через Maven. Добавляем в Maven:

<plugin>
  <groupId>com.github.spotbugs</groupId>
  <artifactId>spotbugs-maven-plugin</artifactId>
  <version>4.2.2</version>
  <dependencies>
     <dependency>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs</artifactId>
        <version>4.2.0</version>
     </dependency>
  </dependencies>
</plugin>
Также в разделе плагинов добавляем:

<plugin>
  <artifactId>maven-project-info-reports-plugin</artifactId>
  <version>2.8</version>
</plugin>

Основные команды SpotBugs

Ну а теперь давайте рассмотрим основные команды для SpotBugs, вызываемые либо через консоль Мавена:Введение в SpotBugs: инструмент для статического анализа кода - 3(чтобы вызвать консоль, нужно нажать на значок m), Либо через терминал idea:Введение в SpotBugs: инструмент для статического анализа кода - 4

1. mvn spotbugs:help

Отображает справочную информацию для пользовательского интерфейса командной строки SpotBugs. Пример результата вызова:Введение в SpotBugs: инструмент для статического анализа кода - 5Как мы видим, если запустить команду: mvn spotbugs:help -Ddetail=true -Dgoal=<goal-name> можно узнать подробнее о настройках цели. Или запустить: mvn spotbugs:help -Ddetail=true и узнать подробнее обо всех четырех целях. Например, я запустил mvn spotbugs:help -Ddetail=true -Dgoal=help и получил следующее описание:Введение в SpotBugs: инструмент для статического анализа кода - 6

2. mvn spotbugs:check

Данная команда запускает анализ и сообщает о неудачной сборке, если обнаруживает какие-либо ошибки из спектра spotbugs. Пример результата запуска команды:Введение в SpotBugs: инструмент для статического анализа кода - 7Тут мы видим, как spotbugs ругается на все найденные недостатки приложения (на найденный плохой код).

3. mvn spotbugs:spotbugs

Данная команда анализирует целевой проект с помощью SpotBugs. Без запуска данной команды, команда по отображению результатов фактически будет бесполезна, т.к. она и производит сам анализ. После запуска данной команды создаётся файл spotbugsXml.xml, в котором и лежат результаты анализа для дальнейшего отображения. Также следует отметить, что запуск команды mvn spotbugs:spotbugs сам по себе ничего не даст: сперва нужно запустить стандартную команду для компиляции проекта mvn clean compile, и только после неё — команду для анализа проекта. Предыдущая рассмотренная команда, mvn spotbugs:check, также анализирует и создаёт файл spotbugsXml.xml, но в отличие от mvn spotbugs:spotbugs она ещё и показывает результат анализа на нижней панели. Для анализа таким путём также сперва нужно запустить mvn clean compile, а только потом — mvn spotbugs:check.

4. mvn spotbugs:gui

Пожалуй, данная команда самая интересная: она запускает графический интерфейс SpotBugs для проверки результатов анализа, в котором вы можете подробно рассмотреть, какие недостатки есть в вашем кода и где они находятся. Но, как я и упомянул выше, для правильной отработки данной команды необходим файл spotbugsXml.xml в папке target, который создаётся после описанных выше манипуляций. При запуске данной команды получаем следующее графическое отображение:Введение в SpotBugs: инструмент для статического анализа кода - 8Тут вы можете настраивать фильтрацию по имени класса, группировать по категориям плохого кода и так далее. Возможные недостатки делятся на типы, которые в свою очередь делятся на конкретные подробные шаблоны ошибок (400+).

Типы ошибок

Давайте же рассмотрим подробнее возможные типы ошибок:
  • Bad practice

    Нарушения рекомендованной практики написания кода.

  • Correctness

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

  • Experimental

    Данный архетип описывает экспериментальные и не полностью проверенные шаблоны ошибок (доверять замечаниям с данным типом ошибки следует с большой осторожностью).

  • Internationalization

    Тип описывает недостатки кода, связанные с интернационализацией и локализацией.

  • Malicious code vulnerability

    Данный тип говорит о том что ваш код уязвим для атак со стороны ненадежного кода.

  • Multithreaded correctness

    Тип описывает недостатки кода, связанные с потоками, блокировками.

  • Bogus random noise

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

  • Performance

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

  • Security

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

  • Dodgy code

    Под данный тип попадает код, который вводит в заблуждение, является аномальным или написан таким образом, что приводит к ошибкам.

Полное подробное описание ошибок вы можете найти в этой документации.Введение в SpotBugs: инструмент для статического анализа кода - 9

Файлы фильтров

Для отлова шаблонов “плохого кода” в SpotBugs используются фильтры. По сути фильтр сопоставляет экземпляры ошибок по набору критериев. Собственно, вы можете составлять собственные вариации шаблонов плохого кода, которые SpotBugs нужно отловить (создать кастомные файлы фильтра). Также с помощью данных файлов фильтров вы можете задавать ошибки, которые нужно исключать при проверке. Возможно, у вас в проекте что-то будет считаться хорошим решением, что по умолчанию фиксируется в анализаторе как плохая практика. Файл фильтра — это XML-документ с FindBugsFilter элементом верхнего уровня, у которого есть некоторое количество дочерних элементов Match. Каждый элемент Match представляет собой предикат, который применяется к сгенерированным экземплярам ошибок. Подробнее о создании файла фильтра можно почитать в этой документации.Введение в SpotBugs: инструмент для статического анализа кода - 10
Комментарии (2)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
panarik 5 уровень, Москва
21 апреля 2021
ну вот, куашники больше не нужны:))