Apa perbedaan antara PMD dan FindBugs?

107

Ada pertanyaan yang membandingkan PMD dan CheckStyle . Namun, saya tidak dapat menemukan perincian yang bagus tentang perbedaan / persamaan antara PMD dan FindBugs. Saya percaya perbedaan utama adalah bahwa PMD bekerja pada kode sumber, sementara FindBugs bekerja pada file bytecode yang dikompilasi. Tetapi dalam hal kapabilitas, haruskah itu menjadi salah satu / atau pilihan atau apakah mereka saling melengkapi?

Thomas Owens
sumber

Jawaban:

151

Saya menggunakan keduanya. Saya pikir mereka saling melengkapi.

Seperti yang Anda katakan, PMD bekerja pada kode sumber dan oleh karena itu menemukan masalah seperti: pelanggaran konvensi penamaan, kurangnya kurung kurawal, pemeriksaan null yang salah tempat, daftar parameter yang panjang, konstruktor yang tidak perlu, tombol putus yang hilang, dll. PMD juga memberi tahu Anda tentang Cyclomatic kompleksitas kode Anda yang menurut saya sangat membantu (FindBugs tidak memberi tahu Anda tentang kompleksitas Cyclomatic).

FindBugs bekerja dengan bytecode. Berikut adalah beberapa masalah yang ditemukan oleh FindBugs yang tidak dilakukan PMD: metode equals () gagal pada subtipe, metode klon dapat mengembalikan null, perbandingan referensi nilai Boolean, cast tidak mungkin, int 32bit digeser dengan jumlah yang tidak dalam kisaran 0-31, koleksi yang berisi dirinya sendiri, metode yang sama selalu mengembalikan nilai true, loop tak terbatas, dll.

Biasanya masing-masing menemukan serangkaian masalah yang berbeda. Gunakan keduanya. Alat-alat ini mengajari saya banyak hal tentang cara menulis kode Java yang baik.

snakile
sumber
Apa kode kesalahan spesifik yang Anda lihat ketika sebuah koleksi berisi dirinya sendiri dan mengapa itu ditandai sebagai kemungkinan bug oleh FindBugs?
Geek
baik karena Sonarqube 6.3 tidak lagi ... Sonarqube sekarang membutuhkan Java 8 dan Findbugs hanya mendukung Java 7
Markus
22

Fitur terbaik dari PMD, adalah XPath Rules-nya , yang dibundel dengan Rule Designer agar Anda dapat dengan mudah membuat aturan baru dari sampel kode (mirip dengan pembuat RegEx dan XPath GUI). FindBugs lebih kuat di luar kotak, tetapi membangun aturan dan pola khusus proyek sangat penting.

Misalnya, saya mengalami masalah kinerja yang melibatkan 2 loop bersarang, menghasilkan waktu berjalan O (n ^ 2), yang dapat dengan mudah dihindari. Saya menggunakan PMD untuk membuat kueri ad-hoc , untuk meninjau contoh lain dari nested for loops - // ForStatement / Statement // ForStatement. Ini menunjukkan 2 contoh masalah lagi. Ini sama sekali bukan aturan umum.

Dekel
sumber
2

PMD adalah

  • terkenal
  • digunakan secara luas dalam industri
  • Anda dapat menambahkan aturan Anda dalam xml
  • memberi Anda analisis mendetail di tingkat Kesalahan dan tingkat peringatan
  • Anda juga dapat memindai kode Anda untuk "salin dan tempel baris". Kode duplikat. Ini memberi ide bagus tentang penerapan java oops.
kunal saxena
sumber
Tidak berbicara dengan FindBugs; mereka saling melengkapi karena kumpulan masalah mereka tidak identik.
Stevers