มีเครื่องมือการวิเคราะห์แบบสแตติกโอเพนซอร์ส C ++ อะไรบ้าง [ปิด]


301

Java มีดีมากเปิดเครื่องมือในการวิเคราะห์แหล่งคงที่บางอย่างเช่นFindBugs , CheckstyleและPMD เครื่องมือเหล่านี้จะง่ายต่อการใช้ประโยชน์มากวิ่งบนระบบปฏิบัติการหลายระบบและฟรี

ผลิตภัณฑ์การวิเคราะห์เชิงสถิต C ++ เชิงพาณิชย์มีให้บริการ แม้ว่าการมีผลิตภัณฑ์ดังกล่าวดีมากค่าใช้จ่ายเป็นวิธีที่มากเกินไปสำหรับนักเรียนและมักจะค่อนข้างยากที่จะรับรุ่นทดลองใช้

ทางเลือกคือการค้นหาเครื่องมือวิเคราะห์โอเพ่นซอร์ส C ++ แบบโอเพ่นซอร์สที่จะทำงานบนหลายแพลตฟอร์ม (Windows และ Unix) ด้วยการใช้เครื่องมือโอเพนซอร์ซมันสามารถปรับเปลี่ยนให้เหมาะสมกับความต้องการบางอย่างได้ การค้นหาเครื่องมือไม่ใช่เรื่องง่าย

ด้านล่างนี้เป็นรายการสั้น ๆ ของเครื่องมือวิเคราะห์แบบคงที่ C ++ ที่พบหรือแนะนำโดยผู้อื่น

สิ่งที่บางคนอื่น ๆแบบพกพามาเปิด c ++ เครื่องมือในการวิเคราะห์แบบคงที่ทุกคนรู้และสามารถแนะนำ?

ลิงก์ที่เกี่ยวข้องบางรายการ


Commercial, DMS Software Reengineering Toolki จัดการ Java, C, C ++ และ COBOL ให้การแยกวิเคราะห์การสร้าง AST การจำแนกชื่อ / ประเภทการวิเคราะห์การควบคุม / การไหลของข้อมูลการวิเคราะห์ที่กำหนดเองและการแปลง ดูsemanticdesigns.com/Products/DMS/DMSToolkit.html
Ira Baxter

1
สำหรับเครื่องมือเชิงพาณิชย์ก็มี CppDepend ( cppdepend.com ) และบางทีเวอร์ชันทดลองอาจเพียงพอสำหรับนักเรียน

คำตอบ:


21

Oink เป็นเครื่องมือที่สร้างขึ้นจากส่วนหน้าของ Elsa C ++ Mozilla's Pork เป็นส่วนหนึ่งของ Elsa / Oink

ดู: http://danielwilkerson.com/oink/index.html


1
ฉันได้รวบรวมรายการกว่า 1,000 รายการในชีวิตของฉัน แต่สำหรับความรักของพระเจ้าฉันไม่สามารถรวบรวมแพ็คเกจนี้ได้ไม่ว่าจะเกิดอะไรขึ้น ฉันพยายามใช้ Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows - แต่ไม่ มีบางอย่างขาดหายไปเสมอและเอกสารประกอบนั้นไม่น่าเชื่อ อย่าเข้าใจฉันผิดฉันเดาว่าเครื่องมือนี้ยอดเยี่ยม แต่เว็บไซต์และเอกสารดูเหมือนไม่มีใครแตะต้องพวกเขาใน 10-15 ปี
Apache

73

CppCheckเป็นโอเพ่นซอร์สและข้ามแพลตฟอร์ม

Mac OSX:

brew install cppcheck

1
@gio ฉันไม่เห็นปัญหาใด ๆ เป็นการส่วนตัว ฉันเชื่อว่า CppCheck มีความสามารถในการข้ามหรือแยกพา ธ หรือไฟล์บางไฟล์ซึ่งช่วย จำกัด ขอบเขตให้แคบลง
Soo Wei Tan

1
บน Windows:choco install cppcheck
KindDragon

53

เกี่ยวกับคอมไพเลอร์ GNU, gcc มีตัวเลือกในตัวที่เปิดใช้งานการเตือนเพิ่มเติมของ -Wall ตัวเลือกคือ-Weffc ++และเกี่ยวกับการฝ่าฝืนหลักเกณฑ์ของScott Meyers ที่ตีพิมพ์ในหนังสือของเขา " C ++ ที่มีประสิทธิภาพและมีประสิทธิภาพมากกว่า "

โดยเฉพาะอย่างยิ่งตัวเลือกตรวจจับรายการต่อไปนี้:

  • กำหนดตัวสร้างสำเนาและตัวดำเนินการกำหนดค่าสำหรับคลาสที่มีหน่วยความจำที่จัดสรรแบบไดนามิก
  • ต้องการเริ่มต้นการกำหนดในการก่อสร้าง
  • ทำให้ destructors เสมือนในคลาสพื้นฐาน
  • มี "โอเปอเรเตอร์ =" ส่งคืนการอ้างอิงถึง * นี้
  • อย่าพยายามส่งคืนข้อมูลอ้างอิงเมื่อคุณต้องส่งคืนวัตถุ
  • แยกแยะระหว่างคำนำหน้าและรูปแบบหลังของการเพิ่มและลด
  • อย่าโอเวอร์โหลด "&&", "||" หรือ ","

7
นอกจาก gcc's -Wall และ -Weffc ++ แล้ว -Wextra ทำการวิเคราะห์แบบสแตติกฟรีที่ดีเช่นสาขาที่ไม่ส่งคืนค่า มันน่าทึ่งวิธีการที่มักโปรแกรมเมอร์มืออาชีพคิดว่าหลังเป็นความคิดที่ดี ...
แฟลชเชอริแดน

24
yuck, -Weffc++เตือนเกี่ยวกับตันของโครงสร้างที่มีความสมบูรณ์ดีใน codebase ขนาดใหญ่ ฉันสองคำแนะนำของ-Wextraแม้ว่า; อย่าออกจากบ้านถ้าไม่มีมัน!
Tom

29

ภายใต้การพัฒนาในขณะนี้ แต่เสียงดังกราวทำการวิเคราะห์ C และมีเป้าหมายที่จะจัดการกับ C ++ เมื่อเวลาผ่านไป มันเป็นส่วนหนึ่งของโครงการLLVM

อัปเดต : ในขณะที่หน้า Landing Page ระบุว่า "เครื่องวิเคราะห์เป็นงานต่อเนื่องที่กำลังดำเนินการ" แต่ขณะนี้ได้รับการบันทึกไว้เป็นตัววิเคราะห์แบบคงที่สำหรับทั้ง C และ C ++

คำถาม: ฉันจะเรียกใช้ GCC / Clang สำหรับการวิเคราะห์แบบคงที่ได้อย่างไร (คำเตือนเท่านั้น)

ตัวเลือกคอมไพเลอร์: -fsyntax-only


1
LLVM เป็นโครงการที่น่าสนใจมากเมื่อเทียบกับ gcc สร้างไบนารีที่ได้รับการปรับปรุงใหม่ในเวลาน้อย และเสียงดังกราวเมื่อเสร็จสมบูรณ์จะเป็นของ front-end ...
นิโคลา Bonelli

ตัวแก้ไขอื่นเพิ่มข้อมูลเกี่ยวกับสวิตช์ -fsyntax เท่านั้น เพิ่งทราบว่ามันเป็นคำขอที่สำคัญในการเรียกใช้การวิเคราะห์ที่คอมไพเลอร์จะทำงานโดยไม่ต้องรวบรวมจริงและปล่อยคำเตือน ฉันไม่แน่ใจ แต่ฉันคิดว่ามันแตกต่างจากการวิเคราะห์แบบคงที่
Don Wakefield

17

มีคนอื่นพูดถึง - Weffc ++ แต่จริง ๆ แล้วเป็นหนึ่งในคำเตือน GCC เดียวที่ฉันไม่เปิดตามค่าเริ่มต้น อย่างไรก็ตามชุดคำเตือนที่ฉันจะเปิดเป็นเครื่องมือวิเคราะห์แบบคงที่ที่สำคัญที่สุดในชุดของฉัน คุณสามารถดูรายการคำเตือนที่แนะนำทั้งหมด

สรุป:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wister-dtor-privacy -Wdisabled-optimization -Wformat = 2 -Winit-self -Wlogical-op -Wmissing- รวม -dirsWnoexcept -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror- ที่ไม่ได้ใช้

โปรดทราบว่าบางส่วนจำเป็นต้องใช้ gcc รุ่นใหม่ดังนั้นคุณอาจจำเป็นต้องลบออกจากรายการของคุณหากคุณติดขัดกับ 4.5 หรือบางอย่าง


14

จอห์นคาร์แมคยังกล่าวถึงPVS-สตูดิโอในครั้งนี้ที่น่าสนใจบล็อกโพสต์ใน "คงวิเคราะห์รหัส"


4
มันไม่ใช่ "โอเพนซอร์ซ" และไม่ "ฟรี" ในแง่ความหมายใด ๆ ของคำนั้น เป็นเครื่องมือวิเคราะห์แบบสแตติกที่รู้จักกันดี (อย่างที่สองรองจากที่ฉันคิดเท่านั้น) แต่ราคาตั๋วค่อนข้างสูง
Tomas Pruzina

7

ถ้าโดยโอเพ่นซอร์สคุณหมายถึง "ฟรี" จริงๆแล้วการวิเคราะห์prefastของ Microsoft เป็นสิ่งที่ดี หลักสูตรของ Windows เท่านั้น มันรวมอยู่ใน Visual Studio & คอมไพเลอร์ เช่น:

cl /analyze Sample.cpp

เวอร์ชันและรุ่นใดที่มีให้บริการในนี้
twk

ดูเหมือนว่าจะสร้างขึ้นในคอมไพเลอร์ซึ่งเป็นอิสระ การรวมเป็นรุ่นที่เป็นไปได้ของทีมเท่านั้น
JBRWilkinson


4

Splintดูเหมือนว่าจะเติมใบเรียกเก็บเงินสำหรับ C.

หากคุณไม่ได้ระบุโอเพ่นซอร์สฉันจะบอกว่าPCLintของGimpel Softwareอาจเป็นหนึ่งในเครื่องมือที่ดีที่สุดสำหรับการตรวจสอบโค้ดคงที่ใน C ++ แต่แน่นอนว่ามันไม่ใช่โอเพ่นซอร์ส

Mac OSX:

brew install splint

2
แต่แพงสำหรับนักพัฒนาเดียว :) ฉันชอบฟรีที่ดีกว่า
Robert Gould

6
เฝือกสำหรับ C ไม่ใช่ C ++ ฉันไม่รู้ว่าพวกเขาวางแผนที่จะขยายความครอบคลุมหรือไม่ หวังว่าอย่างนั้น!
Harold Bamford

ใช่ pclint คุ้มค่าลองมันเป็นส่วนหนึ่งในยูนิกซ์เรียกว่า flexe-lint เวอร์ชั่น 9.0 ต้องเร็วกว่าเวอร์ชัน 8.x เวอร์ชัน 9.0 ยังสนับสนุนส่วนหัวที่รวบรวมไว้ล่วงหน้าเพื่อเพิ่มความเร็วในการวิเคราะห์ ใช้เวลาในการเชื่อง pc-lint มันมี false-positive ซึ่งอาจทำให้คุณเดือดร้อนถ้าคุณไม่สามารถเลือกได้
zhaorufei

3

PREFastของ Microsoft มีอยู่ใน Windows Driver Kit เวอร์ชั่น 7.0 สามารถดาวน์โหลดได้ที่นี่

เอกสาร Microsoft ระบุว่าควรทำงานกับรหัสไดรเวอร์เท่านั้น แต่โพสต์บล็อก (เก่า) นี้โพสต์วางโครงขั้นตอนเพื่อเรียกใช้ บางทีมันสามารถรวมเข้ากับกระบวนการสร้างปกติได้หรือไม่?


PREFAST จะทำให้กระบวนการสร้างของคุณช้าลงอย่างมากสำหรับโครงการจริง ๆ เซิร์ฟเวอร์การสร้างของคุณอาจไม่สามารถจ่ายได้
zhaorufei

@zhaorufei: การวิเคราะห์แบบสแตติกส่วนใหญ่ไม่ได้ "เร็ว"; พวกเขามีงานการวิเคราะห์รหัสที่ซับซ้อนที่ต้องทำโดยนิยาม หากคุณไม่ชอบบิลด์ค่าใช้จ่ายตลอดเวลาเพียงทำให้เป็นตัวเลือก
Ira Baxter

2

เราได้ทำงานกับตัวชี้วัดที่เรียกว่าตัวชี้วัด Eclipse CDT มันยังอยู่ระหว่างการพัฒนา แต่มีการวัดหลัก ๆ บางส่วน (เช่น LSLOC, McCabe, EfferentCoupling) แล้ว

ดูhttp://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentationสำหรับรายละเอียดเพิ่มเติมเช่นวิดีโอสาธิตและเอกสารประกอบ

บิวด์ต่อคืนล่าสุดพร้อมสำหรับการติดตั้งผ่านเว็บไซต์อัปเดตที่ http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

คำอธิบายเพิ่มเติม

เครื่องวัดการวิเคราะห์รหัสที่มา C ++ แบบคงที่และสร้างตัวชี้วัดซอฟต์แวร์ ตัวชี้วัดจะมีการใช้งานเป็นตัวตรวจสอบ Codan สามารถวิเคราะห์ผลการวิเคราะห์ในมุมมองแยกต่างหาก แต่ละเมตริกมีคุณสมบัติที่กำหนดค่าได้ (เช่นเกณฑ์สำหรับ 'บรรทัดสูงสุดของรหัสต่อหน้าที่') เกินเกณฑ์เหล่านี้จะรายงานปัญหาและสร้างเครื่องหมายในโปรแกรมแก้ไขซอร์สโค้ด

ด้วยเครื่องวัดคุณสามารถ:

  • วิเคราะห์ไฟล์ / โฟลเดอร์ / โครงการ C ++
  • กำหนดเกณฑ์การวัดและเปิดใช้งาน / ปิดใช้งานการวัดโดยใช้หน้าการกำหนดค่าตามความชอบ Codans
  • มีตัวทำเครื่องหมายปัญหาในตัวแก้ไขซอร์สโค้ด
  • สำรวจผลลัพธ์การวัด
  • ส่งออกผลลัพธ์ของเมตริกเป็นแท็กคลาวด์ (มีให้เป็นคุณลักษณะเสริมผ่านไซต์อัปเดต)

ตัวชี้วัดในปัจจุบันมาพร้อมกับตัวชี้วัดต่อไปนี้:

  • McCabe (ความซับซ้อนตามวัฏจักร)
  • EfferentCoupling ต่อประเภท
  • บรรทัดซอร์สของโลจิคัลของโค้ด
  • จำนวนสมาชิกต่อประเภท
  • จำนวนพารามิเตอร์ต่อฟังก์ชั่น

1

คุณควรลองใช้เบราว์เซอร์ oo ซึ่งมีการผสมผสานที่ยอดเยี่ยมกับ xemacs


1

นอกจากนี้ยังสามารถโค้ดส่วนขยายของ GCC ในMELT (ภาษาเฉพาะโดเมนที่ออกแบบมาสำหรับการขยาย GCC) หรือปลั๊กอิน GCC ใน C (ยากกว่ามาก) เพื่อทำการวิเคราะห์ที่กำหนดเอง


2
ได้อ่านหนึ่งใน PDF เกี่ยวกับ MELT และขยาย gcc ด้วยการละลายความรู้สึกของฉันก็คือมันยังคงซับซ้อน / diffcult เพื่อเพิ่มปลั๊กอินของคุณเองเพื่อ gcc ไม่ใช่วิธีปฏิบัติสำหรับผู้ใช้ทั่วไป
zhaorufei

1
การขยาย GCC นั้นซับซ้อนไม่ว่าคุณจะทำอย่างไร (ผ่านปลั๊กอิน C, ผ่าน MELT หรือแม้แต่ผ่าน Python) นี่เป็นเพราะ GCC ซับซ้อน และการปรับแต่งใด ๆ c ++ คงเครื่องมือในการวิเคราะห์เป็นเรื่องยากเพราะภาษา C ++ เปคภาษาที่มีความซับซ้อนมากและคุณจะต้องจัดการกับที่สุดของความซับซ้อนที่ (ใด ๆ ที่ไม่น่ารำคาญโปรแกรม C ++ ใช้มาก c ++ คุณสมบัติอาจจะผ่านไลบรารี c ++ มาตรฐาน) .
Basile Starynkevitch

0

Doxygen ทำการวิเคราะห์การไหลของการควบคุมและสร้างกราฟ สิ่งเหล่านั้นอาจไม่ใช่สิ่งที่คุณกำลังมองหา แต่ฉันได้ทำให้พวกเขามีประโยชน์ที่จะดู

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