ฉันเห็นสิ่งพิมพ์ที่ PVS ได้เรียนรู้ที่จะวิเคราะห์ภายใต้ Linux และตัดสินใจลองใช้กับโปรเจ็กต์ของฉันเอง และนี่คือสิ่งที่ออกมาจากมัน
Содержание
ข้อดี
การสนับสนุนที่ตอบสนอง
ฉันขอรหัสทดลองใช้งานและพวกเขาก็ส่งมาให้ฉันในวันเดียวกัน
เอกสารค่อนข้างชัดเจน
เราสามารถเปิดเครื่องวิเคราะห์ได้โดยไม่มีปัญหาใดๆ ความช่วยเหลือสำหรับคำสั่งคอนโซลก็มีให้เช่นกัน (แม้ว่าจะมีข้อร้องเรียนบางประการที่นี่ โปรดดูหัวข้อ
ความเป็นไปได้ของการวิเคราะห์แบบมัลติเธรด
เครื่องวิเคราะห์มีตัวเลือก "มาตรฐาน" -j
ช่วยให้การวิเคราะห์สามารถดำเนินการคู่ขนานในหลาย ๆ งานได้ ซึ่งช่วยประหยัดเวลาได้มาก
การสร้างภาพข้อมูลที่ดี
รูปแบบเอาต์พุตที่แตกต่างกันมากมาย ตั้งแต่ข้อความไปจนถึงเว็บปากกระบอกปืนขนาดเล็ก
รวมเข้ากับชุดประกอบได้ง่าย
เอกสารทั้งหมดอยู่บนเว็บไซต์ ฉันสามารถพูดได้ว่าหากโครงการของคุณสร้างโดยใช้ CMake ทุกอย่างก็ง่ายมาก
คำอธิบายการวินิจฉัยที่ดี
หากคุณสร้างเอาต์พุตในโหมด fullhtml
จากนั้นแต่ละข้อความจะมีลิงก์ไปยังคำอธิบายการวินิจฉัย พร้อมด้วยคำอธิบาย ตัวอย่างโค้ด และลิงก์เพิ่มเติม
cons
ความไม่รู้ของภาษา C++ โดยตัววิเคราะห์
น่าเสียดายที่บางครั้ง PVS ทำให้เกิดข้อผิดพลาดทางไวยากรณ์และสร้างข้อความเชิงบวกที่ผิดพลาดเมื่อโค้ดถูกต้องสมบูรณ์
ตัวอย่างเช่นมีฟังก์ชันที่ส่งคืน void
:
template <typename T>
auto copy (const void * source, void * destination)
->
std::enable_if_t
<
std::is_copy_constructible<T>::value
>
{
new (destination) T(*static_cast<const T *>(source));
}
ใช่เป็นคำสำคัญ auto
แปลว่า void
นั่นคือสิ่งที่มีไว้สำหรับ รถยนต์. แต่ PVS ได้สร้างข้อความต่อไปนี้:
dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.
ไซต์ช้ามาก
ใช่ ในเว็บอินเทอร์เฟซถัดจากแต่ละข้อความ จะมีลิงก์ไปยังคำอธิบายการวินิจฉัยที่เกี่ยวข้องพร้อมตัวอย่าง แต่เมื่อคลิกลิงค์แล้วต้องรอค่อนข้างนานและบางครั้งก็เกิดขึ้น
Язык
คำอธิบายทั้งหมดเป็นภาษารัสเซีย ซึ่งเยี่ยมมาก แต่ลิงก์จากรายงานจะนำไปสู่เวอร์ชันภาษาอังกฤษเสมอ เป็นการดีที่จะสามารถเปลี่ยนภาษาเพื่อให้คุณสามารถดูการวินิจฉัยเป็นภาษารัสเซียได้ทันที ฉันไม่พบตัวเลือกดังกล่าวในอินเทอร์เฟซ
ไม่สะดวกในการทำงานกับระดับการวินิจฉัยผ่านคอนโซล
เริ่มจากข้อเท็จจริงที่ว่าทั้งสองคำสั่งใช้ (นี่ pvs-studio-analyzer
и plog-converter
) รูปแบบต่างๆ สำหรับการระบุการวินิจฉัย
ช่วยสำหรับ pvs-studio-analyzer
อ่าน:
-a [MODE], --analysis-mode [MODE]
MODE defines the type of warnings:
1 - 64-bit errors;
2 - reserved;
4 - General Analysis;
8 - Micro-optimizations;
16 - Customers Specific Requests;
32 - MISRA.
Modes can be combined by adding the values
Default: 4
ฉันใช้เวลานานในการพยายามคิดว่าจะไปที่ไหน เพิ่ม คีย์ (“การเพิ่มค่า”) ฉันพยายามแสดงรายการโดยคั่นด้วยเครื่องหมายจุลภาค:
pvs-studio-analyzer analyze ... -a 1,4,16
ฉันพยายามลงทะเบียนรหัสหลายครั้ง:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16
และแล้วฉันก็ได้รู้ว่านี่คือหน้ากากเล็กๆ! และคุณต้องการ สรุปและไม่ เพิ่ม ความหมาย ตัวอย่างเช่น หากต้องการรับการวินิจฉัยทั่วไป การวินิจฉัยสำหรับการเพิ่มประสิทธิภาพระดับไมโคร และ MISRA คุณต้องสรุปผล (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44
โดยทั่วไปการใช้บิตมาสก์ในส่วนต่อประสานผู้ใช้ถือเป็นรูปแบบที่ไม่ดี ทั้งหมดนี้สามารถสรุปได้เป็นการภายใน และสามารถตั้งค่าชุดแฟล็กสำหรับผู้ใช้ได้
นอกจากนี้ก็ยังมียูทิลิตี้ plog-converter
ซึ่งสร้างข้อมูลการวิเคราะห์คงที่ที่มนุษย์สามารถอ่านได้ เธอมีปัญหาอื่น
ความช่วยเหลือสำหรับโปรแกรม plog-converter
รายงาน:
-a, --analyzer Specifies analyzer(s) and level(s) to be
used for filtering, i.e.
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Default: GA:1,2
“ระดับ” บางส่วนปรากฏที่นี่โดยที่ไม่เคยมีมาก่อน และฉันก็ไม่พบอะไรเกี่ยวกับพวกเขาในเอกสารประกอบเช่นกัน
โดยทั่วไปแล้วยังไม่ชัดเจน นั่นเป็นเหตุผลที่ฉันตั้งค่าทุกอย่างให้สูงสุด
กลุ่มคำสาบานโง่ ๆ เกี่ยวกับ Catch
สองในสามโครงการที่ฉันวิเคราะห์ใช้ไลบรารีการทดสอบหน่วย
ไม่คำนึงถึงมัลติเธรด
มีผลบวกลวงมากมายเกี่ยวกับตัวแปรที่คาดคะเนว่าไม่มีการเปลี่ยนแปลงหรือการวนซ้ำไม่รู้จบ ในขณะที่การทำงานกับตัวแปรเหล่านี้เกิดขึ้นจากเธรดที่แตกต่างกัน และหากไม่เป็นเช่นนั้น การทดสอบหน่วยก็จะไม่ทำงาน
อย่างไรก็ตาม เครื่องวิเคราะห์แบบคงที่สามารถพิจารณาเรื่องนี้ได้หรือไม่ ไม่รู้.
ผลของการ
PVS ไม่พบจุดบกพร่องจริง ๆ ในโครงการโอเพ่นซอร์สของฉัน scan-build
โดยทั่วไปความประทับใจจากเครื่องวิเคราะห์ทั้งหมดจะใกล้เคียงกัน: ใช่ พวกเขาจับบางสิ่งบางอย่างบางครั้งถึงกับมีความสำคัญ แต่โดยรวมแล้วคอมไพเลอร์ก็เพียงพอแล้ว
เป็นไปได้ (และโดยส่วนตัวแล้วฉันชอบคิดเช่นนั้น) ที่ทีมของเราใช้หลักปฏิบัติในการพัฒนาซอฟต์แวร์ที่ช่วยให้เราสามารถสร้างโค้ดห่วยๆ ได้ในปริมาณขั้นต่ำ การไม่สร้างปัญหา ดีกว่าเอาชนะมันอย่างกล้าหาญ
ดังนั้นฉันจึงมีอิสระในการให้คำแนะนำเกี่ยวกับวิธีการเขียนในภาษา C++ ในลักษณะที่จะไม่ยิงขาใครหรือคราดตีหน้าผากใครก็ตาม
ใช้ประโยชน์สูงสุดจากการวินิจฉัยคอมไพเลอร์
ทีมงานของเราใช้ (และแนะนำให้คุณ) ตัวเลือกการรวบรวมต่อไปนี้:
-Werror
-Wall
-Wextra
-Wpedantic
-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo
เปิดใช้งานในโครงการของคุณและเรียนรู้มากมายเกี่ยวกับโค้ดของคุณ
ยึดมั่นในมาตรฐาน
พยายามอย่าใช้สิ่งที่ขึ้นอยู่กับแพลตฟอร์มหากมีอะนาล็อกมาตรฐาน และหากคุณทำไม่ได้จริงๆ หากไม่มีสิ่งเหล่านั้น ให้รวมไว้ในบล็อกพิเศษสำหรับมาโคร (หรืออย่างอื่น) และอย่าปล่อยให้โค้ดของคุณถูกคอมไพล์ภายใต้เงื่อนไขที่ไม่รองรับ
ยึดติดกับความหมายการดำเนินงานมาตรฐาน
การบวกจะต้องเป็นการบวก การคูณจะต้องเป็นการคูณ การเรียกใช้ฟังก์ชันจะต้องเป็นการเรียกใช้ฟังก์ชัน การคัดลอกจะต้องเป็นการคัดลอก การพกพาจะต้องการพกพา คอนเทนเนอร์จะต้องสามารถวนซ้ำได้ ตัววนซ้ำจะต้องมีการเลื่อนระดับ ++
และการลดความนับถือ *
. และอื่น ๆ และอื่น ๆ.
ฉันคิดว่าความคิดนั้นชัดเจน มีข้อกำหนดที่กำหนดไว้ซึ่งไม่มีผลผูกพัน แต่ผู้ใช้และผู้อ่านโค้ดของคุณทุกคนคาดหวังที่จะเห็น อย่าพยายามเอาชนะผู้อื่น ไม่เช่นนั้น คุณจะเอาชนะตัวเองได้
เขียนโค้ดที่เข้ากันได้
ก่อนอื่น ฉันหมายถึงไลบรารีมาตรฐาน เป็นที่พึงปรารถนาอย่างยิ่งว่าอินเทอร์เฟซของคลาสและฟังก์ชันของคุณสามารถใช้กับไลบรารีมาตรฐานและไลบรารีอื่น ๆ ได้ (เช่น Boost)
อย่าลังเลที่จะดูอินเทอร์เฟซ STL และ Boost ด้วยข้อยกเว้นที่หายาก คุณจะเห็นแบบอย่างที่ดีที่นั่น
ใช้ประโยชน์สูงสุดจากเครื่องมือโอเพ่นซอร์ส
สำหรับการวิเคราะห์แบบคงที่เดียวกัน มีเครื่องมือฟรีแบบเปิดอย่างน้อยสองตัวที่สามารถเชื่อมต่อได้เพียงครั้งเดียวกับโปรเจ็กต์ใดๆ ที่มีระบบ CMake build
เล่ม
สุดท้ายนี้ ฉันอยากจะเน้นย้ำว่าฉันไม่สนับสนุนให้ไม่ใช้ PVS หรือเครื่องวิเคราะห์แบบคงที่อื่นๆ แต่ฉันขอแนะนำให้คุณลองพิจารณาว่ามันเกิดขึ้นได้อย่างไรที่ตัววิเคราะห์แบบคงที่พบข้อผิดพลาดที่สำคัญในโค้ดของคุณอยู่ตลอดเวลา
นี่เป็นเพียงผลที่ตามมา เราจำเป็นต้องค้นหาและกำจัดสาเหตุ
ที่มา: will.com