Чи є спосіб ігнорувати одне попередження 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.