Pengantar FindBugs

1. Ikhtisar

FindBugs adalah alat open source yang digunakan untuk melakukan analisis statis pada kode Java.

Pada artikel ini, kita akan melihat pengaturan FindBugs pada proyek Java dan mengintegrasikannya ke dalam IDE dan Maven build.

2. Plugin FindBugs Maven

2.1. Konfigurasi Maven

Untuk mulai membuat laporan analisis statis, pertama-tama kita perlu menambahkan plugin FindBugs di pom.xml kita :

   org.codehaus.mojo findbugs-maven-plugin 3.0.4   

Anda dapat melihat versi terbaru plugin di Maven Central.

2.2. Pembuatan Laporan

Sekarang kita memiliki plugin Maven yang dikonfigurasi dengan benar, mari buat dokumentasi proyek menggunakan perintah mvn site .

Laporan tersebut akan dibuat di folder target / situs di direktori proyek dengan nama findbugs.html .

Anda juga dapat menjalankan perintah mvn findbugs: gui untuk meluncurkan antarmuka GUI guna menelusuri laporan yang dihasilkan untuk proyek saat ini.

Plugin FindBugs juga dapat dikonfigurasi untuk gagal dalam beberapa keadaan - dengan menambahkan pemeriksaan tujuan eksekusi ke konfigurasi kami:

 org.codehaus.mojo findbugs-maven-plugin 3.0.4  Max     check    

The usaha - ketika maxed out, melakukan analisis yang lebih lengkap dan tepat, mengungkapkan lebih banyak bug dalam kode, meskipun, mengkonsumsi lebih banyak sumber daya dan membutuhkan lebih banyak waktu untuk selesai.

Anda sekarang dapat menjalankan perintah mvn verifikasi , untuk memeriksa apakah build akan berhasil atau tidak - tergantung pada cacat yang terdeteksi saat menjalankan analisis.

Anda juga dapat meningkatkan proses pembuatan laporan dan lebih mengontrol analisis, dengan menambahkan beberapa konfigurasi dasar ke deklarasi plugin:

 org.baeldung.web.controller.* FindNullDeref FindReturnRef 

The onlyAnalyze pilihan menyatakan dipisahkan koma nilai-nilai kelas / paket yang memenuhi syarat untuk analisis.

Opsi pengunjung / omitVisitors juga merupakan nilai yang dipisahkan koma, mereka digunakan untuk menentukan detektor mana yang harus / tidak boleh dijalankan selama analisis - Perhatikan bahwa pengunjung dan omitVisitors tidak dapat digunakan secara bersamaan .

Detektor ditentukan berdasarkan nama kelasnya, tanpa kualifikasi paket apa pun. Temukan detail dari semua nama kelas pendeteksi yang tersedia dengan mengikuti tautan ini.

3. Plugin FindBugs Eclipse

3.1. Instalasi

Instalasi IDE dari FindBugs Plugin cukup mudah - Anda hanya perlu menggunakan fitur pembaruan perangkat lunak di Eclipse , dengan situs pembaruan berikut: //findbugs.cs.umd.edu/eclipse .

Untuk memastikan bahwa FindBugs diinstal dengan benar di lingkungan Eclipse Anda, cari opsi berlabel FindBugs di bawah Windows -> Preferensi -> Java.

3.2. Laporan Penjelajahan

Untuk meluncurkan analisis statis pada proyek menggunakan plugin FindBugs Eclipse, Anda perlu mengklik kanan proyek di penjelajah paket, lalu klik opsi berlabel temukan bug .

Setelah diluncurkan, Eclipse menunjukkan hasil di bawah jendela Bug Explorer seperti yang ditunjukkan pada gambar di bawah:

Mulai versi 2, FindBugs mulai memeringkat bug dengan skala dari 1 hingga 20 untuk mengukur tingkat keparahan cacat:

  • Paling menakutkan : peringkat antara 1 & 4.
  • Menakutkan : peringkat antara 5 & 9.
  • Masalah : peringkat antara 10 & 14.
  • Perhatian : peringkat antara 15 & 20.

Meskipun peringkat bug menggambarkan tingkat keparahan, faktor kepercayaan mencerminkan kemungkinan bug ini ditandai sebagai bug asli. Keyakinan ini awalnya disebut prioritas , tetapi diganti namanya di versi baru.

Tentu saja, beberapa cacat dapat terbuka untuk interpretasi, dan mereka bahkan dapat ada tanpa menyebabkan kerusakan pada perilaku yang diinginkan dari suatu perangkat lunak. Itu sebabnya, dalam situasi dunia nyata, kita perlu mengonfigurasi alat analisis statis dengan benar dengan memilih sekumpulan cacat terbatas untuk diaktifkan dalam proyek tertentu.

3.3. Konfigurasi Eclipse

Plugin FindBugs memudahkan untuk menyesuaikan strategi analisis bug, dengan menawarkan berbagai cara untuk memfilter peringatan dan membatasi ketatnya hasil. Anda dapat memeriksa antarmuka konfigurasi dengan membuka Window -> Preferences -> Java -> FindBugs:

Anda dapat dengan bebas menghapus centang pada kategori yang tidak diinginkan, menaikkan peringkat minimum untuk dilaporkan, menentukan keyakinan minimum untuk dilaporkan, dan menyesuaikan penanda untuk peringkat bug - Peringatan, Info, atau Kesalahan.

FindBugs membagi cacat dalam banyak kategori:

  • Benar - mengumpulkan bug umum, misalnya loop tak terbatas, penggunaan equals () yang tidak tepat , dll
  • Praktik buruk , misalnya penanganan pengecualian, aliran terbuka, Perbandingan string, dll
  • Performa , misalnya objek diam
  • Ketepatan multithread - mengumpulkan inkonsistensi sinkronisasi dan berbagai masalah dalam lingkungan multi-threaded
  • Internasionalisasi - mengumpulkan masalah yang terkait dengan pengkodean dan internasionalisasi aplikasi
  • Malicious code vulnerability – gathers vulnerabilities in code, e.g. code snippets that can be exploited by potential attackers
  • Security – gathers security holes related to specific protocols or SQL injections
  • Dodgy – gathers code smells, e.g. useless comparisons, null checks, unused variables, etc

Under the Detector configuration tab, you can check the rules you're supposed to respect in your project:

The speed attribute reflects how costly the analysis will be. The fastest the detector, the smallest the resources consumed to perform it.

You can find the exhaustive list of bugs recognized by FindBugs at the official documentation page.

Under the Filter files panel, you can create custom file filters, in order to include/exclude parts of the code-base. This feature is useful – for example – when you want to prevent “unmanaged” or “trash” code, defects to pop up in the reports, or may exclude all classes from the test package for instance.

4. FindBugs IntelliJ IDEA Plugin

4.1. Installation

If you are an IntelliJ IDEA fan, and you want to start inspecting Java code using FindBugs, you can simply grab the plugin installation package from the official JetBrains site, and extract it to the folder %INSTALLATION_DIRECTORY%/plugins. Restart your IDE and you're good to go.

Alternatively, you can navigate to Settings -> Plugins and search all repositories for FindBugs plugin.

By the time of writing this article, the version 1.0.1 of the IntelliJ IDEA plugin is just out,

To make sure that the FindBugs plugin is properly installed, check for the option labeled “Analyze project code” under Analyze -> FindBugs.

4.2. Reports Browsing

In order to launch static analysis in IDEA, click on “Analyze project code”, under Analyze -> FindBugs, then look for the FindBugs-IDEA panel to inspect the results:

You can use the second column of commands on the left side of the screenshot, to group defects using different factors:

  1. Group by a bug category.
  2. Group by a class.
  3. Group by a package.
  4. Group by a bug rank.

It is also possible to export the reports in XML/HTML format, by clicking the “export” button in the fourth column of commands.

4.3. Configuration

The FindBugs plugin preferences pages inside IDEA is pretty self-explanatory:

This settings window is quite similar to the one we've seen in Eclipse, thus you can perform all kinds of configuration in an analogous fashion, starting from analysis effort level, bugs ranking, confidence, classes filtering, etc.

The preferences panel can be accessed inside IDEA, by clicking the “Plugin preferences” icon under the FindBugs-IDEA panel.

5. Report Analysis for the Spring-Rest Project

In this section we're going to shed some light on a static analysis done on the spring-rest project available on Github as an example:

Most of the defects are minor — Of Concern, but let's see what we can do to fix some of them.

Method ignores exceptional return value:

File fileServer = new File(fileName); fileServer.createNewFile();

As you can probably guess, FindBugs is complaining about the fact that we're throwing away the return value of the createNewFile() method. A possible fix would be to store the returned value in a newly declared variable, then, log something meaningful using the DEBUG log level — e.g. “The named file does not exist and was successfully created” if the returned value is true.

The method may fail to close stream on exception: this particular defect illustrates a typical use case for exception handling that suggests to always close streams in a finally block:

try { DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); String fileName = dateFormat.format(new Date()); File fileServer = new File(fileName); fileServer.createNewFile(); byte[] bytes = file.getBytes(); BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer)); stream.write(bytes); stream.close(); return "You successfully uploaded " + username; } catch (Exception e) { return "You failed to upload " + e.getMessage(); }

When an exception is thrown before the stream.close() instruction, the stream is never closed, that's why it's always preferable to make use of the finally{} block to close streams opened during a try/catch routine.

An Exception is caught when Exception is not thrown: As you may already know, catching Exception is a bad coding practice, FindBugs thinks that you must catch a most specific exception, so you can handle it properly. So basically manipulating streams in a Java class, catching IOException would be more appropriate than catching a more generic Exception.

Field not initialized in the constructor but dereferenced without null check: it always a good idea to initialize fields inside constructors, otherwise, we should live with the possibility that the code will raise an NPE. Thus, it is recommended to perform null checks whenever we're not sure if the variable is properly initialized or not.

6. Conclusion

In this article, we've covered the basic key points to use and customize FindBugs in a Java project.

As you can see, FindBugs is a powerful, yet simple static analysis tool, it helps to detect potential quality holes in your system – if tuned and used correctly.

Terakhir, perlu disebutkan bahwa FindBugs juga dapat dijalankan sebagai bagian dari alat peninjau kode otomatis berkelanjutan yang terpisah seperti Sputnik , yang dapat sangat membantu untuk memberikan visibilitas yang lebih besar pada laporan.

Kode sampel yang kami gunakan untuk analisis statis tersedia di Github.