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 .