Есть ли способ игнорировать одно предупреждение FindBugs?

195

С PMD, если вы хотите игнорировать конкретное предупреждение, вы можете использовать, // NOPMDчтобы эту строку игнорировали.

Есть ли что-то подобное для FindBugs?

Бен С
источник

Ответы:

310

Первоначальный подход FindBugs включает в себя файлы конфигурации XML или фильтры . Это действительно менее удобно, чем решение PMD, но FindBugs работает с байт-кодом, а не с исходным кодом, поэтому комментарии, очевидно, не вариант. Пример:

<Match>
   <Class name="com.mycompany.Foo" />
   <Method name="bar" />
   <Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>

Однако, чтобы решить эту проблему, FindBugs позже представил другое решение на основе аннотаций (см. SuppressFBWarnings), Которое вы можете использовать на уровне класса или на уровне метода (на мой взгляд, более удобно, чем XML). Пример (возможно, не самый лучший, но, ну, это всего лишь пример):

@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
    value="HE_EQUALS_USE_HASHCODE", 
    justification="I know what I'm doing")

Обратите внимание, что поскольку FindBugs 3.0.0 SuppressWarningsустарела в пользу @SuppressFBWarningsиз-за конфликта имен с Java SuppressWarnings.

Паскаль Тивент
источник
4
Бонусный вопрос: Как мне найти соответствующее значение для данной сообщаемой "ошибки" (с помощью сонара)?
PlanBForOpenOffice
29
Конечно, проблема с использованием подхода аннотации состоит в том, что ваш код довольно бесполезно импортирует (и последующую зависимость) библиотеку Findbugs :(
Эшли Уолтон
9
@AshleyWalton хранение аннотаций - CLASS, так что, по крайней мере, это только зависимость от времени компиляции
earcam
17
Для тех пользователей Maven вы можете использовать следующее для импорта аннотаций. (Кроме того, область действия установлена, поэтому ваш проект не зависит от FindBugs во время выполнения). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
Bramp
7
Пользователи Maven должны добавить <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>в свой POM, если они хотят использовать @SuppressFBWarnings.
Янсон
22

Как уже упоминалось, вы можете использовать @SuppressFBWarningsаннотацию. Если вы не хотите или не можете добавить еще одну Зависимость к своему коду, вы можете добавить аннотацию к своему коду самостоятельно, Findbugs не заботится о том, в каком пакете находится аннотация.

@Retention(RetentionPolicy.CLASS)
public @interface SuppressFBWarnings {
    /**
     * The set of FindBugs warnings that are to be suppressed in
     * annotated element. The value can be a bug category, kind or pattern.
     *
     */
    String[] value() default {};

    /**
     * Optional documentation of the reason why the warning is suppressed
     */
    String justification() default "";
}

Источник: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88

hinneLinks
источник
15

Вот более полный пример фильтра XML (приведенный выше пример сам по себе не будет работать, так как он просто показывает фрагмент и пропускает <FindBugsFilter>теги begin и end):

<FindBugsFilter>
    <Match>
        <Class name="com.mycompany.foo" />
        <Method name="bar" />
        <Bug pattern="NP_BOOLEAN_RETURN_NULL" />
    </Match>
</FindBugsFilter>

Если вы используете плагин Android Studio FindBugs, перейдите к файлу XML-фильтра, выбрав Файл-> Другие настройки-> Настройки по умолчанию-> Другие настройки-> НайтиBugs-IDEA-> Фильтр-> Исключить файлы фильтра-> Добавить.

mbonness
источник
10

Обновите Gradle

dependencies {
    compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}

Найдите отчет FindBugs

Файл: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html

Найти конкретное сообщение

найти ошибки

Импортируйте правильную версию аннотации

import edu.umd.cs.findbugs.annotations.SuppressWarnings;

Добавьте аннотацию прямо над кодом ошибки

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Смотрите здесь для получения дополнительной информации: findbugs Spring Annotation

anataliocs
источник
1
compile 'net.sourceforge.findbugs:annotations:1.3.2'Вместо этого вы можете использовать синтаксис, который короче.
Косиара - Бартош Косаржицкий
3
+1, но будьте добры, уточните свой ответ следующим образом: gradle testCompile 'com.google.code.findbugs:annotations:3.0.0'и имя аннотации@SuppressFBWarnings
Влад Бачурин
8

На момент написания этой статьи (май 2018 года), похоже, FindBugs были заменены SpotBugs . Использование SuppressFBWarningsаннотации требует, чтобы ваш код компилировался с Java 8 или новее, и вводит зависимость от времени компиляции spotbugs-annotations.jar.

Использование файла фильтра для фильтрации правил SpotBugs не имеет таких проблем. Документация здесь .

Стив
источник
Ваша ссылка на SpotBugs кажется неверной. Я нашел это на spotbugs.github.io вместо этого.
Амеди Ван Гассе
1

Хотя другие ответы здесь действительны, они не являются полным рецептом для решения этой проблемы.

В духе полноты:

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

<dependency>
  <groupId>com.google.code.findbugs</groupId>
  <artifactId>findbugs-annotations</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>

Это позволяет использовать @SuppressFBWarningsеще одну зависимость, которая обеспечивает @SuppressWarnings. Однако вышесказанное более понятно.

Затем вы добавляете аннотацию над вашим методом:

Например

@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE",
        justification = "Scanning generated code of try-with-resources")
@Override
public String get() {
    try (InputStream resourceStream =  owningType.getClassLoader().getResourceAsStream(resourcePath);
         BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream, UTF_8))) { ... }

Это включает в себя как имя ошибки, так и причину, по которой вы отключаете сканирование для нее.

Эшли Фриз
источник
-6

Я собираюсь оставить это здесь: https://stackoverflow.com/a/14509697/1356953

Обратите внимание, что это работает, java.lang.SuppressWarningsпоэтому нет необходимости использовать отдельную аннотацию.

@SuppressWarnings для поля подавляет только предупреждения findbugs, сообщаемые для этого объявления поля, а не каждое предупреждение, связанное с этим полем.

Например, это подавляет предупреждение «Только поле всегда равно нулю»:

@SuppressWarnings ("UWF_NULL_FIELD") String s = null; Я думаю, что лучшее, что вы можете сделать, - это выделить код с предупреждением в наименьший возможный метод, а затем подавить предупреждение для всего метода.

оборота 00500005
источник
8
java.lang.SuppressWarningsне могу работать У него есть сохранение источника, поэтому он не виден багам.
Филипп Астон