Введение в FindBugs

1. Обзор

FindBugs - это инструмент с открытым исходным кодом, используемый для статического анализа кода Java.

В этой статье мы рассмотрим настройку FindBugs для Java-проекта и его интеграцию в IDE и сборку Maven.

2. Плагин FindBugs Maven

2.1. Конфигурация Maven

Чтобы начать создавать отчеты статического анализа, нам сначала нужно добавить плагин FindBugs в нашем pom.xml :

<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>3.0.4</version>
        </plugin>
    </plugins>
</reporting>

Вы можете проверить последняя версия плагина на Maven Central.

2.2. Генерация отчетов

Теперь, когда у нас правильно настроен плагин Maven, давайте сгенерируем документацию по проекту с помощью команды mvn site .

Отчет будет сгенерирован в папке target/site в каталоге проекта под именем findbugs.html .

Вы также можете запустить команду mvn findbugs: gui , чтобы запустить интерфейс GUI и просмотреть сгенерированные отчеты для текущего проекта.

Плагин FindBugs также можно настроить на сбой при некоторых обстоятельствах - добавив цель выполнения check в нашу конфигурацию:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>3.0.4</version>
    <configuration>
        <effort>Max</effort>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

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

Теперь вы можете запустить команду mvn verify , чтобы проверить, будет ли сборка успешной или нет - в зависимости от дефектов, обнаруженных во время анализа.

Вы также можете улучшить процесс генерации отчетов и получить больше контроля над анализом, добавив некоторые базовые настройки в объявление плагина:

<configuration>
    <onlyAnalyze>org.baeldung.web.controller.** </onlyAnalyze>
    <omitVisitors>FindNullDeref</omitVisitors>
    <visitors>FindReturnRef</visitors>
</configuration>

Параметр onlyAnalyze объявляет разделенные запятыми значения классов/пакетов, подходящих для анализа.

Опции visitors / omitVisitors также являются значениями, разделенными запятыми, они используются для указания того, какие детекторы должны/не должны запускаться во время анализа. Обратите внимание, что visitors и omitVisitors нельзя использовать одновременно .

Детектор указывается по имени класса, без какой-либо квалификации пакета. Для получения подробной информации обо всех доступных именах классов детекторов перейдите по ссылке this link .

3. Плагин Eclipse для FindBugs

3.1. Монтаж

Установка IDE плагина FindBugs довольно проста - вам просто нужно использовать функцию обновления программного обеспечения в Eclipse _, на следующем сайте обновления: http://findbugs.cs.umd.edu/eclipse . _

Чтобы убедиться, что FindBugs правильно установлен в вашей среде Eclipse, найдите параметр с пометкой FindBugs в Windows → Настройки → Java.

3.2. Просмотр отчетов

Чтобы запустить статический анализ проекта с помощью плагина FindBugs Eclipse, необходимо щелкнуть правой кнопкой мыши проект в проводнике пакетов, а затем щелкнуть параметр с пометкой find bugs .

После запуска Eclipse показывает результаты в окне Bug Explorer, как показано на скриншоте ниже:

ссылка:/uploads/bug__explorer.png%20652w[]Начиная с версии 2 FindBugs начал ранжировать ошибки со шкалой от 1 до 20, чтобы измерить серьезность дефектов:

  • Самый страшный : ранжируется между 1

  • Страшно : оценивается между 5

  • Беспокойство : рейтинг от 10 до 14.

  • Обеспокоенность : рейтинг между 15

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

Конечно, некоторые дефекты могут быть открыты для интерпретации, и они могут даже существовать, не нанося вреда желаемому поведению программного обеспечения.

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

3.3. Конфигурация Eclipse

Плагин FindBugs позволяет легко настроить стратегию анализа ошибок, предлагая различные способы фильтрации предупреждений и ограничения строгости результатов. Вы можете проверить интерфейс конфигурации, перейдя в Window → Preferences → Java → FindBugs:

ссылка:/uploads/fb__preferences-1.png%20668w[]

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

FindBugs делят дефекты на множество категорий:

  • Правильность - собирает общие ошибки, например бесконечные петли,

неправильное использование equals () и т. д. Плохая практика ** , например обработка исключений, открытые потоки, строки

сравнение и т. д. Производительность ** , например праздные объекты

  • Многопоточная корректность - собирает несоответствия синхронизации

и различные проблемы в многопоточной среде Интернационализация ** - собирает проблемы, связанные с кодированием и

интернационализация приложения Уязвимость вредоносного кода ** - собирает уязвимости в коде, например

фрагменты кода, которые могут быть использованы потенциальными злоумышленниками Безопасность ** - собирает дыры в безопасности, связанные с конкретными протоколами или

Инъекции SQL Хитрый ** - собирает запахи кода, например бесполезные сравнения, нулевые проверки,

неиспользуемые переменные и т. д.

На вкладке Детектор конфигурации вы можете проверить правила, которые вы должны соблюдать в вашем проекте:

ссылка:/uploads/fb preferences detector-1.png%20729w[]

  • Атрибут скорости отражает, насколько затратным будет анализ ** . Самый быстрый детектор, самые маленькие ресурсы, затраченные на его выполнение.

Полный список ошибок, обнаруженных FindBugs, можно найти по адресу официальная страница документации .

На панели Фильтр файлов вы можете создавать пользовательские фильтры файлов, чтобы включать/исключать части базы кода. Эта функция полезна, например, когда вы хотите предотвратить «неуправляемый» или «мусорный» код, появление дефектов в отчетах или, например, исключить все классы из тестового пакета.

4. FindBugs Плагин IntelliJ IDEA

4.1. Монтаж

Если вы являетесь поклонником IntelliJ IDEA и хотите начать проверку кода Java с помощью FindBugs, вы можете просто загрузить установочный пакет плагина с сайта official JetBrains. и распакуйте его в папку% INSTALLATION__DIRECTORY%/plugins. Перезапустите IDE, и все готово.

Кроме того, вы можете перейти к настройкам → Плагины и поискать во всех репозиториях плагин FindBugs.

На момент написания этой статьи версия 1.0.1 плагина IntelliJ IDEA только вышла

Чтобы убедиться, что плагин FindBugs установлен правильно, проверьте параметр «Анализ кода проекта» в разделе «Анализировать → FindBugs».

4.2. Просмотр отчетов

Чтобы запустить статический анализ в IDEA, нажмите «Анализ кода проекта» в разделе «Анализировать → FindBugs», а затем найдите панель «FindBugs-IDEA» для проверки результатов:

ссылка:/uploads/Spring-rest-analysis-1.png%20489w[]

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

, Группировка по категории ошибок.

, Группировка по классу.

, Группировка по пакету.

, Группировка по рангу ошибки.

Также можно экспортировать отчеты в формате XML/HTML, нажав кнопку «Экспорт» в четвертом столбце команд.

4.3. Конфигурация

Страницы настроек плагина FindBugs внутри IDEA довольно понятны:

ссылка:/uploads/IntelliJ-Preferences-1-1.png%20506w[]

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

Доступ к панели настроек можно получить из IDEA, щелкнув значок «Настройки плагинов» под панелью FindBugs-IDEA.

5. Анализ отчетов для проекта Spring-Rest

В этом разделе мы рассмотрим статический анализ, выполненный в проекте spring-rest, доступном на Github :

ссылка:/uploads/Spring-rest-analysis-2.png%20489w[]

Большинство дефектов незначительны - из проблем, но давайте посмотрим, что мы можем сделать, чтобы исправить некоторые из них.

  • Метод игнорирует исключительное возвращаемое значение: **

File fileServer = new File(fileName);
fileServer.createNewFile();

Как вы можете догадаться, FindBugs жалуется на тот факт, что мы отбрасываем возвращаемое значение метода createNewFile () . Возможным исправлением будет сохранение возвращенного значения во вновь объявленной переменной, а затем запись чего-либо значимого с использованием уровня журнала DEBUG - например, « Именованный файл не существует и был успешно создан », если возвращаемое значение равно true.

  • Метод может не закрывать поток при исключении: этот конкретный дефект иллюстрирует типичный вариант использования для обработки исключений, который предлагает всегда закрывать потоки в finally блоке ** :

try {
    DateFormat dateFormat
      = new SimpleDateFormat("yyyy__MM__dd__HH.mm.ss");
    String fileName = dateFormat.format(new Date());
    File fileServer = new File(fileName);
    fileServer.createNewFile();
    byte[]bytes = file.getBytes();
    BufferedOutputStream stream
      = new BufferedOutputStream(new FileOutputStream(fileServer));
    stream.write(bytes);
    stream.close();
    return "You successfully uploaded " + username;
} catch (Exception e) {
    return "You failed to upload " + e.getMessage();
}

Когда перед инструкцией stream.close () создается исключение, поток никогда не закрывается, поэтому всегда предпочтительно использовать блок finally \ {} для закрытия потоков, открытых во время процедуры try / catch .

  • Exception перехватывается, когда Exception не генерируется ** : Как вы, возможно, уже знаете, перехват Exception является плохой практикой кодирования, FindBugs считает, что вы должны перехватить самое конкретное исключение, чтобы вы могли правильно его обработать. Таким образом, в основном манипулируя потоками в классе Java, перехват IOException был бы более уместным, чем перехват более общего исключения.

  • Поле не инициализировано в конструкторе, но разыменовано без проверки на ноль ** : всегда хорошая идея инициализировать поля внутри конструкторов, в противном случае мы должны жить с возможностью того, что код вызовет NPE . Таким образом, рекомендуется выполнять нулевые проверки всякий раз, когда мы не уверены, правильно ли инициализирована переменная или нет.

6. Заключение

В этой статье мы рассмотрели основные ключевые моменты использования и настройки FindBugs в проекте Java.

Как вы можете видеть, FindBugs - это мощный, но простой инструмент статического анализа, который помогает обнаруживать потенциальные пробелы в вашей системе - при правильной настройке и использовании.

Наконец, стоит отметить, что FindBugs также можно запускать как часть отдельного инструмента непрерывной автоматической проверки кода, такого как Sputnik , который может быть очень полезен для обеспечения большей наглядности отчетов ,

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