Чи є спосіб ігнорувати одне попередження FindBugs?


194

За допомогою PMD, якщо ви хочете ігнорувати певне попередження, ви можете використовувати // NOPMDігнорувати цей рядок.

Чи є щось подібне для FindBugs?

Відповіді:


309

Первинний підхід 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
Питання про бонус: Як знайти відповідне значення для даної повідомленої "помилки" (за допомогою sonar)?
— PlanBForOpenOffice

29
Проблема, звичайно, із використанням підходу до анотації полягає в тому, що ваш код досить непотрібно імпортує (і подальшу залежність) до бібліотеки Findbugs :(
— Ешлі Уолтон

9
@AshleyWalton збереження анотацій є КЛАС, тому принаймні це лише залежність від часу компіляції
— 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


15

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

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

Якщо ви використовуєте плагін Android Studio FindBugs, перейдіть до файлу фільтрів XML, використовуючи Файл-> Інші налаштування-> Налаштування за замовчуванням-> Інші налаштування-> FindBugs-IDEA-> Filter-> Виключити файли фільтрів-> Додати.


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 Весняна анотація


1
Ви можете використовувати compile 'net.sourceforge.findbugs:annotations:1.3.2'синтаксис, який коротший.
— kosiara - Бартош Косаржицький

3
+1, але люб’язно оновіть свою відповідь: gradle testCompile 'com.google.code.findbugs:annotations:3.0.0'та ім'я анотації@SuppressFBWarnings
— Vlad.Bachurin

8

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

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


Здається, ваше посилання на SpotBugs невірно. Я знайшов його на spotbugs.github.io замість цього.
— Амедей Ван Гассе

1

Хоча інші відповіді тут справедливі, вони не є повним рецептом для вирішення цього питання.

У дусі повноти:

У вашому пом-файлі потрібно мати анотації findbugs - вони лише час компіляції, щоб ви могли використовувати 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") Рядок s = null; Я думаю, що найкраще, що ви можете зробити, це виділити код з попередженням в найменший спосіб, який ви можете, а потім придушити попередження щодо всього методу.


8
java.lang.SuppressWarningsне може працювати. Він має збереження джерела, тому його не видно для пошуку помилок.
— Філіп Астон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.