Apakah ada cara untuk mengabaikan peringatan FindBugs tunggal?

194

Dengan PMD, jika Anda ingin mengabaikan peringatan tertentu, Anda dapat menggunakannya // NOPMDuntuk mengabaikannya.

Apakah ada yang serupa untuk FindBugs?

Ben S
sumber

Jawaban:

308

Pendekatan awal FindBugs melibatkan file konfigurasi XML alias filter . Ini benar-benar kurang nyaman daripada solusi PMD tetapi FindBugs bekerja pada bytecode, bukan pada kode sumber, jadi komentar jelas bukan pilihan. Contoh:

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

Namun, untuk mengatasi masalah ini, FindBugs kemudian memperkenalkan solusi lain berdasarkan anotasi (lihat SuppressFBWarnings) yang dapat Anda gunakan di kelas atau di tingkat metode (lebih nyaman daripada XML menurut saya). Contoh (mungkin bukan yang terbaik tetapi, well, itu hanya contoh):

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

Perhatikan bahwa sejak FindBugs 3.0.0 SuppressWarningstidak digunakan lagi @SuppressFBWarningskarena bentrok nama dengan Java SuppressWarnings.

Thivent Pascal
sumber
4
Pertanyaan Bonus: Bagaimana cara menemukan nilai yang sesuai untuk "bug" yang dilaporkan (menggunakan sonar)?
PlanBForOpenOffice
29
Masalahnya, tentu saja dengan menggunakan pendekatan anotasi adalah bahwa kode Anda agak tidak perlu diimpor (dan ketergantungan berikutnya) perpustakaan Findbugs :(
Ashley Walton
9
@AshleyWalton retensi anotasi adalah CLASS, jadi setidaknya itu hanya ketergantungan waktu kompilasi
earcam
17
Untuk pengguna Maven tersebut, Anda dapat menggunakan yang berikut untuk mengimpor anotasi. (Bonus, ruang lingkup diatur sehingga proyek Anda tidak bergantung pada FindBugs saat runtime). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
bramp
7
Pengguna Maven harus menambahkan <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>ke POM mereka jika ingin menggunakannya @SuppressFBWarnings.
jansohn
22

Seperti yang disebutkan orang lain, Anda dapat menggunakan @SuppressFBWarningsAnotasi. Jika Anda tidak ingin atau tidak dapat menambahkan Ketergantungan lain ke kode Anda, Anda dapat menambahkan Anotasi ke Kode Anda sendiri, Findbugs tidak peduli di mana Paket Anotasi itu berada.

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

Sumber: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88

hinneLinks
sumber
15

Berikut adalah contoh filter XML yang lebih lengkap (contoh di atas dengan sendirinya tidak akan berfungsi karena hanya memperlihatkan cuplikan dan tidak ada <FindBugsFilter>tag awal dan akhir):

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

Jika Anda menggunakan plugin Android Studio FindBugs, telusuri file filter XML Anda menggunakan File-> Pengaturan Lainnya-> Pengaturan Default-> Pengaturan Lainnya-> FindBugs-IDEA-> Filter-> Kecualikan file filter-> Tambah.

ketidaknyamanan
sumber
10

Perbarui Gradle

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

Temukan Laporan FindBugs

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

Temukan pesan spesifik

menemukan bug

Impor versi anotasi yang benar

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

Tambahkan anotasi langsung di atas kode yang menyinggung

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Lihat di sini untuk info lebih lanjut: Annotation Spring Annotation

anataliocs
sumber
1
Anda bisa menggunakan compile 'net.sourceforge.findbugs:annotations:1.3.2'sintaks yang lebih pendek.
kosiara - Bartosz Kosarzycki
3
+1, tetapi silakan perbarui jawaban Anda dengan: gradle testCompile 'com.google.code.findbugs:annotations:3.0.0'dan nama anotasi@SuppressFBWarnings
Vlad.Bachurin
8

Pada saat penulisan ini (Mei 2018), FindBugs tampaknya telah digantikan oleh SpotBugs . MenggunakanSuppressFBWarnings anotasi membutuhkan kode Anda untuk dikompilasi dengan Java 8 atau lebih baru dan memperkenalkan ketergantungan waktu kompilasi spotbugs-annotations.jar.

Menggunakan file filter untuk memfilter aturan SpotBugs tidak memiliki masalah seperti itu. Dokumentasinya ada di sini .

steve
sumber
Tautan Anda ke SpotBugs tampaknya salah. Saya menemukannya di spotbugs.github.io sebagai gantinya.
Amedee Van Gasse
1

Sementara jawaban lain di sini valid, mereka bukan resep lengkap untuk menyelesaikan ini.

Dalam semangat kelengkapan:

Anda harus memiliki anotasi findbugs dalam file pom Anda - mereka hanya mengkompilasi waktu, sehingga Anda dapat menggunakan providedcakupan:

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

Ini memungkinkan penggunaan @SuppressFBWarningsada ketergantungan lain yang menyediakan @SuppressWarnings. Namun, hal di atas lebih jelas.

Kemudian Anda menambahkan anotasi di atas metode Anda:

Misalnya

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

Ini termasuk nama bug dan juga alasan mengapa Anda menonaktifkan pemindaian untuk itu.

Ashley Frieze
sumber
-6

Saya akan meninggalkan yang ini di sini: https://stackoverflow.com/a/14509697/1356953

Harap dicatat bahwa ini berfungsi dengan baik java.lang.SuppressWarningssehingga tidak perlu menggunakan anotasi terpisah.

@SuppressWarnings pada bidang hanya menekan peringatan findbugs yang dilaporkan untuk deklarasi bidang itu, tidak setiap peringatan yang terkait dengan bidang itu.

Misalnya, ini menekan peringatan "Field only ever set to null":

@SuppressWarnings ("UWF_NULL_FIELD") String s = null; Saya pikir yang terbaik yang dapat Anda lakukan adalah mengisolasi kode dengan peringatan ke dalam metode terkecil yang Anda bisa, kemudian menekan peringatan pada seluruh metode.

00500005
sumber
8
java.lang.SuppressWarningstidak bisa bekerja Ini memiliki retensi sumber, sehingga tidak terlihat oleh bug.
Philip Aston