สำหรับเครื่องมือในการวิเคราะห์แบบคงที่ผมมักจะใช้ CPD, PMD , FindBugsและCheckstyle
CPD คือเครื่องมือ "Copy / Paste Detector" ของ PMD ผมใช้ PMD สำหรับเล็ก ๆ น้อย ๆ ในขณะที่ก่อนที่ผมสังเกตเห็นการเชื่อมโยง "Finding ซ้ำโค้ด"บนหน้าเว็บ PMD
ฉันอยากจะชี้ให้เห็นว่าบางครั้งเครื่องมือเหล่านี้สามารถขยายได้นอกเหนือจากชุดกฎที่ "ใช้งานได้ทันที" และไม่ใช่เพียงเพราะเป็นโอเพนซอร์สเพื่อให้คุณสามารถเขียนซ้ำได้ เครื่องมือเหล่านี้บางส่วนมาพร้อมกับแอปพลิเคชันหรือ "ตะขอ" ที่ช่วยให้สามารถขยายได้ ตัวอย่างเช่น PMD มาพร้อมกับเครื่องมือ "นักออกแบบ"ที่ช่วยให้คุณสร้างกฎใหม่ได้ นอกจากนี้ Checkstyle ยังมีการตรวจสอบDescendantTokenที่มีคุณสมบัติที่อนุญาตให้ปรับแต่งได้มากมาย
ฉันรวมเครื่องมือเหล่านี้กับมดที่ใช้สร้าง คุณสามารถไปที่ลิงก์เพื่อดูการกำหนดค่าความคิดเห็นของฉัน
นอกเหนือจากการผสานรวมอย่างง่ายเข้ากับบิลด์แล้วฉันพบว่าการกำหนดค่าเครื่องมือให้ "บูรณาการ" ค่อนข้างมีประโยชน์ด้วยวิธีอื่น ๆ ได้แก่ การสร้างรายงานและความสม่ำเสมอในการปราบปรามคำเตือน ฉันต้องการเพิ่มประเด็นเหล่านี้ในการสนทนานี้ (ซึ่งน่าจะมีแท็ก "การวิเคราะห์แบบคงที่" ด้วย): ผู้คนกำหนดค่าเครื่องมือเหล่านี้เพื่อสร้างโซลูชัน "แบบรวม" ได้อย่างไร (ฉันถามคำถามนี้แยกต่างหากที่นี่ )
ขั้นแรกสำหรับรายงานคำเตือนฉันจะแปลงผลลัพธ์เพื่อให้คำเตือนแต่ละรายการมีรูปแบบที่เรียบง่าย:
/absolute-path/filename:line-number:column-number: warning(tool-name): message
ซึ่งมักเรียกว่า "รูปแบบ Emacs" แต่แม้ว่าคุณจะไม่ได้ใช้ Emacs แต่ก็เป็นรูปแบบที่เหมาะสมสำหรับการทำให้รายงานเป็นเนื้อเดียวกัน ตัวอย่างเช่น:
/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.
คำเตือนการเปลี่ยนแปลงรูปแบบของฉันจะทำโดยสคริปต์มดของฉันกับมดfilterchains
"บูรณาการ" ที่สองที่ฉันทำคือการปราบปรามการเตือน โดยค่าเริ่มต้นเครื่องมือแต่ละตัวรองรับความคิดเห็นหรือคำอธิบายประกอบ (หรือทั้งสองอย่าง) ที่คุณสามารถวางไว้ในโค้ดของคุณเพื่อปิดปากคำเตือนที่คุณต้องการละเว้น แต่คำขอระงับคำเตือนต่างๆเหล่านี้ไม่มีรูปลักษณ์ที่สอดคล้องกันซึ่งดูเหมือนจะงี่เง่า เมื่อคุณระงับคำเตือนคุณกำลังระงับคำเตือนดังนั้นทำไมไม่เขียน " SuppressWarning
?" เสมอไป
ตัวอย่างเช่นการกำหนดค่าเริ่มต้นของ PMD จะยับยั้งการสร้างคำเตือนในบรรทัดของโค้ดที่มีสตริง " NOPMD
" ในข้อคิดเห็น นอกจากนี้ PMD ยังรองรับ@SuppressWarnings
คำอธิบายประกอบของ Java ฉันกำหนดค่า PMD ให้ใช้ความคิดเห็นที่มี " SuppressWarning(PMD.
" แทนNOPMD
เพื่อให้การปราบปราม PMD ดูเหมือนกัน ฉันกรอกกฎเฉพาะที่ละเมิดเมื่อใช้การระงับรูปแบบความคิดเห็น:
// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained
เฉพาะส่วน " SuppressWarnings(PMD.
" เท่านั้นที่มีความสำคัญสำหรับความคิดเห็น แต่สอดคล้องกับการสนับสนุนของ PMD สำหรับ@SuppressWarning
คำอธิบายประกอบซึ่งยอมรับการละเมิดกฎแต่ละรายการตามชื่อ:
@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended
ในทำนองเดียวกัน Checkstyle จะยับยั้งการสร้างคำเตือนระหว่างคู่ความคิดเห็น (ไม่มีการสนับสนุนคำอธิบายประกอบ) ตามค่าเริ่มต้นความคิดเห็นในการปิดและเปิด Checkstyle จะมีสตริงCHECKSTYLE:OFF
และCHECKSTYLE:ON
ตามลำดับ การเปลี่ยนการกำหนดค่านี้ (ด้วย "SuppressionCommentFilter" ของ Checkstyle) เพื่อใช้สตริง " BEGIN SuppressWarnings(CheckStyle.
" และ " END SuppressWarnings(CheckStyle.
" ทำให้การควบคุมดูเหมือน PMD มากขึ้น:
// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)
ด้วยความคิดเห็นของ Checkstyle การละเมิดเช็คโดยเฉพาะ ( HiddenField
) มีความสำคัญเนื่องจากการตรวจสอบแต่ละรายการมีBEGIN/END
คู่ความคิดเห็น " " ของตัวเอง
FindBugs ยังสนับสนุนการปราบปรามการสร้างคำเตือนด้วย@SuppressWarnings
คำอธิบายประกอบดังนั้นจึงไม่จำเป็นต้องกำหนดค่าเพิ่มเติมเพื่อให้ได้ระดับความสม่ำเสมอกับเครื่องมืออื่น ๆ น่าเสียดายที่ Findbugs ต้องรองรับ@SuppressWarnings
คำอธิบายประกอบแบบกำหนดเองเนื่องจากคำอธิบายประกอบ Java ในตัว@SuppressWarnings
มีSOURCE
นโยบายการเก็บรักษาซึ่งไม่รัดกุมเพียงพอที่จะเก็บคำอธิบายประกอบไว้ในไฟล์คลาสที่ FindBugs ต้องการ ฉันมีคุณสมบัติครบถ้วนในการระงับคำเตือนของ FindBugs เพื่อหลีกเลี่ยงการปะทะกับ@SuppressWarnings
คำอธิบายประกอบของ Java :
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
เทคนิคเหล่านี้ทำให้สิ่งต่างๆดูสอดคล้องกันอย่างสมเหตุสมผลในเครื่องมือต่างๆ โปรดทราบว่าการระงับคำเตือนแต่ละรายการมีสตริง " SuppressWarnings
" ทำให้ง่ายต่อการเรียกใช้การค้นหาอย่างง่ายเพื่อค้นหาอินสแตนซ์ทั้งหมดสำหรับเครื่องมือทั้งหมดในฐานรหัสทั้งหมด