Czy istnieje sposób na zignorowanie jednego ostrzeżenia FindBugs?

194

W przypadku PMD, jeśli chcesz zignorować określone ostrzeżenie, możesz użyć // NOPMDtej linii do zignorowania.

Czy istnieje coś podobnego do FindBugs?

Ben S.
źródło

Odpowiedzi:

308

Początkowe podejście FindBugs obejmuje pliki konfiguracyjne XML, czyli filtry . Jest to naprawdę mniej wygodne niż rozwiązanie PMD, ale FindBugs działa na kodzie bajtowym, a nie na kodzie źródłowym, więc komentarze oczywiście nie są opcją. Przykład:

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

Jednak, aby rozwiązać ten problem, FindBugs wprowadził później inne rozwiązanie oparte na adnotacjach (patrz SuppressFBWarnings), które można wykorzystać na poziomie klasy lub metody (moim zdaniem wygodniejsze niż XML). Przykład (może nie najlepszy, ale cóż, to tylko przykład):

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

Zauważ, że odkąd FindBugs 3.0.0 SuppressWarningszostał wycofany na korzyść z @SuppressFBWarningspowodu konfliktu nazw z Javą SuppressWarnings.

Pascal Thivent
źródło
4
Pytanie bonusowe: Jak znaleźć odpowiednią wartość dla danego zgłoszonego „błędu” (przy użyciu sonaru)?
PlanBForOpenOffice
29
Problem, oczywiście przy użyciu metody adnotacji, polega na tym, że kod niepotrzebnie importuje (i późniejszą zależność) bibliotekę Findbugs :(
Ashley Walton
9
@AshleyWalton przechowywanie adnotacji ma klasę, więc przynajmniej jest to tylko zależność czasowa kompilacji
kamera
17
W przypadku użytkowników Maven możesz zaimportować adnotacje w następujący sposób. (Bonus, zakres jest ustawiony, więc twój projekt nie zależy od FindBugs w czasie wykonywania). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
bramp
7
Użytkownicy Maven powinni dodać <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>do swojej POM, jeśli chcą skorzystać @SuppressFBWarnings.
jansohn,
22

Jak inni wspomnieli, możesz użyć @SuppressFBWarningsAdnotacji. Jeśli nie chcesz lub nie możesz dodać innej zależności do swojego kodu, możesz sam dodać adnotację do swojego kodu, Findbugs nie ma znaczenia, w której paczce jest adnotacja.

@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 "";
}

Źródło: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88

hinneLinks
źródło
15

Oto bardziej kompletny przykład filtra XML (powyższy przykład sam w sobie nie będzie działał, ponieważ pokazuje tylko fragment kodu i brakuje <FindBugsFilter>tagów początkowego i końcowego):

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

Jeśli korzystasz z wtyczki FindBugs dla Androida Studio, przejdź do pliku filtru XML, używając Plik-> Inne ustawienia-> Ustawienia domyślne-> Inne ustawienia-> FindBugs-IDEA-> Filtr-> Wyklucz pliki filtrów-> Dodaj.

smutek
źródło
10

Zaktualizuj Gradle

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

Znajdź raport FindBugs

plik: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html

Znajdź konkretną wiadomość

znajdź błędy

Zaimportuj poprawną wersję adnotacji

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

Dodaj adnotację bezpośrednio nad obraźliwym kodem

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Zobacz tutaj, aby uzyskać więcej informacji: findbugs Spring Adnotation

anatalioki
źródło
1
Zamiast tego możesz użyć compile 'net.sourceforge.findbugs:annotations:1.3.2'składni, która jest krótsza.
kosiara - Bartosz Kosarzycki
3
+1, ale uprzejmie zaktualizuj swoją odpowiedź za pomocą: nazwy stopnia testCompile 'com.google.code.findbugs:annotations:3.0.0'i adnotacji@SuppressFBWarnings
Vlad.Bachurin
8

W chwili pisania tego tekstu (maj 2018) FindBugs wydaje się być zastąpiony przez SpotBugs . Korzystanie z SuppressFBWarningsadnotacji wymaga kompilacji kodu w Javie 8 lub nowszej i wprowadza zależność od czasu kompilacji spotbugs-annotations.jar.

Używanie pliku filtru do filtrowania reguł SpotBugs nie ma takich problemów. Dokumentacja jest tutaj .

Steve
źródło
Twój link do SpotBugs wydaje się niepoprawny. Zamiast tego znalazłem to w spotbugs.github.io .
Amedee Van Gasse,
1

Chociaż inne odpowiedzi tutaj są prawidłowe, nie są one pełnym przepisem na rozwiązanie tego problemu.

W duchu kompletności:

Musisz mieć adnotacje findbugs w pliku pom - to tylko czas kompilacji, więc możesz użyć providedzakresu:

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

Pozwala to na użycie @SuppressFBWarningsinnej zależności, która zapewnia @SuppressWarnings. Powyższe jest jednak jaśniejsze.

Następnie dodajesz adnotację nad metodą:

Na przykład

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

Obejmuje to zarówno nazwę błędu, jak i powód wyłączenia skanowania.

Ashley Frieze
źródło
-6

Zostawię to tutaj: https://stackoverflow.com/a/14509697/1356953

Pamiętaj, że działa java.lang.SuppressWarningsto bez potrzeby używania osobnej adnotacji.

@SuppressWarnings na polu pomija tylko ostrzeżenia findbugs zgłoszone dla tej deklaracji pola, nie każde ostrzeżenie związane z tym polem.

Na przykład, pomija to ostrzeżenie „Pole zawsze ustawione na zero”:

@SuppressWarnings („UWF_NULL_FIELD”) String s = null; Myślę, że najlepsze, co możesz zrobić, to wyizolować kod z ostrzeżeniem na najmniejszą możliwą metodę, a następnie ukryć ostrzeżenie dla całej metody.

00500005
źródło
8
java.lang.SuppressWarningsnie mogę pracować Ma zachowanie źródła, więc nie jest widoczny dla findbugs.
Philip Aston,