การตรวจสอบ PVS-Studio อย่างอิสระ (Linux, C++)

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


Содержание

  1. ข้อดี
  2. cons
  3. ผลของการ
  4. เล่ม

ข้อดี

การสนับสนุนที่ตอบสนอง

ฉันขอรหัสทดลองใช้งานและพวกเขาก็ส่งมาให้ฉันในวันเดียวกัน

เอกสารค่อนข้างชัดเจน

เราสามารถเปิดเครื่องวิเคราะห์ได้โดยไม่มีปัญหาใดๆ ความช่วยเหลือสำหรับคำสั่งคอนโซลก็มีให้เช่นกัน (แม้ว่าจะมีข้อร้องเรียนบางประการที่นี่ โปรดดูหัวข้อ cons).

ความเป็นไปได้ของการวิเคราะห์แบบมัลติเธรด

เครื่องวิเคราะห์มีตัวเลือก "มาตรฐาน" -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.

ไซต์ช้ามาก

ใช่ ในเว็บอินเทอร์เฟซถัดจากแต่ละข้อความ จะมีลิงก์ไปยังคำอธิบายการวินิจฉัยที่เกี่ยวข้องพร้อมตัวอย่าง แต่เมื่อคลิกลิงค์แล้วต้องรอค่อนข้างนานและบางครั้งก็เกิดขึ้น การหมดเวลาของเกตเวย์ 504.

Язык

คำอธิบายทั้งหมดเป็นภาษารัสเซีย ซึ่งเยี่ยมมาก แต่ลิงก์จากรายงานจะนำไปสู่เวอร์ชันภาษาอังกฤษเสมอ เป็นการดีที่จะสามารถเปลี่ยนภาษาเพื่อให้คุณสามารถดูการวินิจฉัยเป็นภาษารัสเซียได้ทันที ฉันไม่พบตัวเลือกดังกล่าวในอินเทอร์เฟซ

ไม่สะดวกในการทำงานกับระดับการวินิจฉัยผ่านคอนโซล

เริ่มจากข้อเท็จจริงที่ว่าทั้งสองคำสั่งใช้ (นี่ 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

สองในสามโครงการที่ฉันวิเคราะห์ใช้ไลบรารีการทดสอบหน่วย Catch2. และส่วนแบ่งข้อความของสิงโต (!!! 90 จาก 138 ในหนึ่งและ 297 จาก 344 ในอีกอัน!!!) มีรูปแบบดังต่อไปนี้:

การตรวจสอบ PVS-Studio อย่างอิสระ (Linux, C++)

ไม่คำนึงถึงมัลติเธรด

มีผลบวกลวงมากมายเกี่ยวกับตัวแปรที่คาดคะเนว่าไม่มีการเปลี่ยนแปลงหรือการวนซ้ำไม่รู้จบ ในขณะที่การทำงานกับตัวแปรเหล่านี้เกิดขึ้นจากเธรดที่แตกต่างกัน และหากไม่เป็นเช่นนั้น การทดสอบหน่วยก็จะไม่ทำงาน

การตรวจสอบ PVS-Studio อย่างอิสระ (Linux, C++)

อย่างไรก็ตาม เครื่องวิเคราะห์แบบคงที่สามารถพิจารณาเรื่องนี้ได้หรือไม่ ไม่รู้.

ผลของการ

PVS ไม่พบจุดบกพร่องจริง ๆ ในโครงการโอเพ่นซอร์สของฉัน ถ่ายภาพต่อเนื่อง и Proximaเช่นเดียวกับในร่างการทำงานซึ่งฉันไม่สามารถนำเสนอได้ด้วยเหตุผลที่ชัดเจน จริงอยู่ที่ว่าควรจำไว้ว่ามีข้อบกพร่องบางประการที่ได้รับการแก้ไขและแก้ไขก่อนหน้านี้โดยใช้ ซีพีเช็ค и 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

เพิ่มความคิดเห็น