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

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

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


person Ben S    schedule 02.12.2009    source источник


Ответы (7)


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

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

Однако для решения этой проблемы FindBugs позже представил другое решение, основанное на аннотациях (см. _ 2_), который можно использовать в классе или в на уровне метода (на мой взгляд, удобнее, чем 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 из-за конфликта имен с SuppressWarnings в Java.

person Pascal Thivent    schedule 02.12.2009
comment
Дополнительный вопрос: как мне найти подходящее значение для заданной обнаруженной ошибки (с помощью сонара)? - person PlanBForOpenOffice; 04.08.2011
comment
Проблема, конечно, с использованием подхода аннотации заключается в том, что ваш код без необходимости импортирует (и последующую зависимость) библиотеку Findbugs :( - person Ashley Walton; 03.02.2012
comment
@AshleyWalton, сохранение аннотаций - КЛАСС, так что, по крайней мере, это только зависимость времени компиляции - person earcam; 09.02.2012
comment
Для этих пользователей Maven вы можете использовать следующее для импорта аннотаций. (Бонус, объем установлен, поэтому ваш проект не зависит от FindBugs во время выполнения). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency> - person bramp; 16.12.2013
comment
@PlanBForOpenOffice В Sonar название ошибки FindBugs называется ключом правила, и его можно найти, щелкнув имя правила. - person barfuin; 27.01.2014
comment
@ edu.umd.cs.findbugs.annotations.SuppressWarnings работает, но как указать несколько значений? - person Babu Srinivasan; 28.10.2014
comment
Пользователи Maven должны добавить <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency> в свой POM, если они хотят использовать @SuppressFBWarnings. - person jansohn; 13.08.2015

Как уже упоминалось, вы можете использовать аннотацию @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

person hinneLinks    schedule 06.07.2017

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

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

Если вы используете плагин Android Studio FindBugs, перейдите к своему XML-файлу фильтра, используя File-> Other Settings-> Default Settings-> Other Settings-> FindBugs-IDEA-> Filter-> Exclude filter files-> Add.

person mbonness    schedule 02.06.2014

Обновить Gradle

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

Найдите отчет о найденных ошибках

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

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

найти ошибки

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

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

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

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Дополнительную информацию см. Здесь: Spring Annotation findbugs

person anataliocs    schedule 17.08.2016
comment
Вместо этого вы можете использовать синтаксис compile 'net.sourceforge.findbugs:annotations:1.3.2', который короче. - person kosiara - Bartosz Kosarzycki; 11.10.2016
comment
+1, но любезно обновите свой ответ, указав: gradle testCompile 'com.google.code.findbugs:annotations:3.0.0' и имя аннотации @SuppressFBWarnings - person Vlad.Bachurin; 26.05.2017

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

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

person steve    schedule 25.05.2018
comment
Ваша ссылка на SpotBugs кажется неверной. Вместо этого я нашел его на spotbugs.github.io. - person Amedee Van Gasse; 16.08.2018

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

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

Вам необходимо иметь аннотации 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. Однако сказанное выше яснее.

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

E.g.

@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))) { ... }

Сюда входит как название ошибки, так и причина, по которой вы отключили сканирование для нее.

person Ashley Frieze    schedule 30.03.2020

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

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

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

Например, это подавляет предупреждение «Поле только когда-либо установлено в нулевое значение»:

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

person Community    schedule 04.02.2016
comment
java.lang.SuppressWarnings не может работать. Он сохраняет исходный код, поэтому он не виден для поиска ошибок. - person Philip Aston; 22.03.2016