อะไรคือความแตกต่างระหว่าง PMD และ FindBugs?


107

มีเป็นคำถามเปรียบเทียบ PMD และ Checkstyle อย่างไรก็ตามฉันไม่พบรายละเอียดที่ดีเกี่ยวกับความแตกต่าง / ความคล้ายคลึงระหว่าง PMD และ FindBugs ฉันเชื่อว่าความแตกต่างที่สำคัญคือ PMD ทำงานกับซอร์สโค้ดในขณะที่ FindBugs ทำงานกับไฟล์ bytecode ที่คอมไพล์แล้ว แต่ในแง่ของความสามารถมันควรเป็นอย่างใดอย่างหนึ่ง / หรือทางเลือกหรือเสริมซึ่งกันและกัน?

คำตอบ:


151

ฉันใช้ทั้งสองอย่าง ฉันคิดว่าพวกเขาเสริมซึ่งกันและกัน

ดังที่คุณกล่าวไว้PMDทำงานกับซอร์สโค้ดดังนั้นจึงพบปัญหาเช่น: การละเมิดหลักการตั้งชื่อการขาดวงเล็บปีกกาการตรวจสอบค่าว่างผิดตำแหน่งรายการพารามิเตอร์แบบยาวตัวสร้างที่ไม่จำเป็นการขาดสวิตช์ในสวิตช์ ฯลฯ PMD ยังบอกคุณเกี่ยวกับCyclomatic ความซับซ้อนของรหัสของคุณซึ่งฉันพบว่ามีประโยชน์มาก (FindBugs ไม่ได้บอกคุณเกี่ยวกับความซับซ้อนของ Cyclomatic)

FindBugsทำงานบน bytecode ต่อไปนี้เป็นปัญหาบางประการที่ FindBugs พบว่า PMD ไม่ได้: วิธีการเท่ากับ () ล้มเหลวในประเภทย่อยวิธีการโคลนอาจส่งคืนค่า null การเปรียบเทียบการอ้างอิงของค่าบูลีนการร่ายที่เป็นไปไม่ได้ 32 บิต int ถูกเลื่อนโดยจำนวนที่ไม่อยู่ในช่วง 0-31 คอลเลกชันที่มีตัวมันเองวิธีการเท่ากับจะคืนค่าจริงเสมอลูปที่ไม่มีที่สิ้นสุดเป็นต้น

โดยปกติแล้วแต่ละคนจะพบปัญหาที่แตกต่างกัน ใช้ทั้งสองอย่าง เครื่องมือเหล่านี้สอนฉันมากมายเกี่ยวกับวิธีการเขียนโค้ด Java ที่ดี


รหัสข้อผิดพลาดเฉพาะที่คุณเห็นเมื่อคอลเลกชันมีตัวมันเองคืออะไรและเหตุใด FindBugs จึงถูกระบุว่าเป็นจุดบกพร่องที่น่าจะเป็นไปได้
Geek

เนื่องจาก Sonarqube 6.3 ไม่มีอีกต่อไป ... ขณะนี้ Sonarqube ต้องการ Java 8 และ Findbugs รองรับเฉพาะ Java 7 เท่านั้น
Markus

22

คุณสมบัติที่ดีที่สุดของ PMD คือกฎ XPath ที่มาพร้อมกับ Rule Designer เพื่อให้คุณสร้างกฎใหม่จากตัวอย่างโค้ด (คล้ายกับ RegEx และ XPath GUI builders) FindBugs นั้นแข็งแกร่งกว่านอกกรอบ แต่การสร้างกฎและรูปแบบเฉพาะโครงการเป็นสิ่งสำคัญมาก

ตัวอย่างเช่นฉันพบปัญหาด้านประสิทธิภาพที่เกี่ยวข้องกับ 2 ที่ซ้อนกันสำหรับลูปส่งผลให้มีเวลาทำงาน O (n ^ 2) ซึ่งสามารถหลีกเลี่ยงได้ง่าย ฉันใช้ PMD เพื่อสร้างแบบสอบถามเฉพาะกิจเพื่อตรวจสอบอินสแตนซ์อื่น ๆ ที่ซ้อนกันสำหรับลูป - // ForStatement / Statement // ForStatement สิ่งนี้ชี้ให้เห็นอีก 2 กรณีของปัญหา นี่ไม่ใช่กฎทั่วไป แต่อย่างใด


2

PMD คือ

  • มีชื่อเสียง
  • ใช้กันอย่างแพร่หลายในอุตสาหกรรม
  • คุณสามารถเพิ่มกฎของคุณใน xml
  • ให้การวิเคราะห์โดยละเอียดในระดับข้อผิดพลาดและระดับคำเตือน
  • คุณยังสามารถสแกนโค้ดของคุณเพื่อ "คัดลอกและวางบรรทัด" รหัสซ้ำ สิ่งนี้ให้ความคิดที่ดีเกี่ยวกับการใช้ java oops

ไม่พูดกับ FindBugs; เป็นส่วนเสริมเนื่องจากชุดปัญหาไม่เหมือนกัน
Stevers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.