JavaRush /Java блог /Random UA /Вступ до SpotBugs: інструмент для статичного аналізу коду...
Константин
36 рівень

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

Стаття з групи Random UA
Розробники гостро потребують того, щоб хтось перевіряв їхній код. Особливо це стосується розробників-початківців. Але іноді перевірка чужого коду займає дуже багато часу, та й заняття це нудне. Однак ігнорувати цей аспект розробки не можна, адже він безпосередньо впливає на якість продукту та й на якість вас як розробника в цілому. Вступ до 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є предикатом, який застосовується до згенерованих екземплярів помилок. Докладніше про створення файлу фільтра можна почитати в цій документації .
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ