เบื่อกับการทบทวนโค้ดหรือการดีบักไม่รู้จบ บางครั้งคุณก็คิดถึงวิธีทำให้ชีวิตของคุณง่ายขึ้น และหลังจากค้นหาเพียงเล็กน้อยหรือโดยบังเอิญ คุณจะเห็นวลีมหัศจรรย์: “การวิเคราะห์แบบคงที่” มาดูกันว่ามันคืออะไรและมันสามารถโต้ตอบกับโครงการของคุณได้อย่างไร
ในความเป็นจริง หากคุณเขียนในภาษาสมัยใหม่ใดๆ ก็ตาม คุณจะเรียกใช้ผ่านเครื่องวิเคราะห์แบบคงที่โดยไม่รู้ตัว ความจริงก็คือคอมไพเลอร์สมัยใหม่ทุกตัวมีคำเตือนเล็กน้อยเกี่ยวกับปัญหาที่อาจเกิดขึ้นในโค้ด ตัวอย่างเช่น เมื่อคอมไพล์โค้ด C++ ใน Visual Studio คุณอาจเห็นสิ่งต่อไปนี้:
В этом выводе мы видим, что переменная คือ так и не была использована нигде в функции. Так что на самом деле вы почти всегда пользовались простеньким статическим анализатором кода. Однако, в отличие от профессиональных анализаторов, таких как Coverity, Klocwork или PVS-Studio, предоставляемые компилятором предупреждения могут указывать только на небольшой спектр проблем.
หากคุณไม่ทราบแน่ชัดว่าการวิเคราะห์แบบคงที่คืออะไรและจะนำไปใช้อย่างไร
เหตุใดคุณจึงต้องมีการวิเคราะห์แบบคงที่
โดยสรุป: การเร่งความเร็วและลดความซับซ้อน
การวิเคราะห์แบบคงที่ช่วยให้คุณพบปัญหาต่างๆ มากมายในโค้ด ตั้งแต่การใช้โครงสร้างภาษาที่ไม่ถูกต้องไปจนถึงการพิมพ์ผิด ตัวอย่างเช่นแทนที่จะเป็น
auto x = obj.x;
auto y = obj.y;
auto z = obj.z;
คุณเขียนโค้ดต่อไปนี้:
auto x = obj.x;
auto y = obj.y;
auto z = obj.x;
อย่างที่คุณเห็น มีการพิมพ์ผิดในบรรทัดสุดท้าย ตัวอย่างเช่น PVS-Studio ออกคำเตือนต่อไปนี้:
หากคุณต้องการจัดการกับข้อผิดพลาดนี้ ให้ลองใช้ตัวอย่างสำเร็จรูปใน Compiler Explorer: *
และอย่างที่คุณเข้าใจ มันเป็นไปไม่ได้เสมอไปที่จะใส่ใจกับส่วนของโค้ดดังกล่าวในทันที และด้วยเหตุนี้ คุณจึงสามารถนั่งแก้ไขจุดบกพร่องได้เป็นเวลาหนึ่งชั่วโมง และสงสัยว่าทำไมทุกอย่างถึงทำงานแปลกๆ
อย่างไรก็ตาม นี่เป็นข้อผิดพลาดอย่างชัดเจน จะเกิดอะไรขึ้นถ้านักพัฒนาเขียนโค้ดที่ไม่เหมาะสมเพราะเขาลืมความละเอียดอ่อนของภาษาไปบ้าง? หรือแม้กระทั่งอนุญาตในรหัส
สำหรับสถานการณ์เหล่านี้เองที่การวิเคราะห์แบบคงที่ปรากฏขึ้น นี่คือผู้ช่วยสำหรับนักพัฒนาที่จะชี้ให้เห็นปัญหาต่างๆ ในโค้ด และอธิบายในเอกสารประกอบว่าเหตุใดจึงไม่จำเป็นต้องเขียนในลักษณะนี้ สิ่งที่สามารถนำไปสู่ และวิธีแก้ไข นี่คือตัวอย่างสิ่งที่อาจมีลักษณะดังนี้: *
คุณสามารถค้นหาข้อผิดพลาดที่น่าสนใจเพิ่มเติมที่เครื่องวิเคราะห์สามารถตรวจพบได้ในบทความ:
ข้อผิดพลาด 10 อันดับแรกในโครงการ C ++ สำหรับปี 2019 ข้อผิดพลาด 10 อันดับแรกในโปรเจ็กต์ C# ปี 2019 10 Bugs ในโครงการ Java ประจำปี 2019
เมื่อคุณได้อ่านเนื้อหานี้แล้วและมั่นใจในประโยชน์ของการวิเคราะห์แบบคงที่แล้ว คุณอาจต้องการลองใช้ดู แต่จะเริ่มต้นที่ไหน? จะรวมเครื่องมือใหม่เข้ากับโปรเจ็กต์ปัจจุบันของคุณได้อย่างไร แล้วจะแนะนำทีมให้เขารู้จักได้อย่างไร? คุณจะพบคำตอบสำหรับคำถามเหล่านี้ด้านล่าง
หมายเหตุ การวิเคราะห์แบบคงที่ไม่สามารถแทนที่หรือยกเลิกสิ่งที่มีประโยชน์เช่นการตรวจสอบโค้ดได้ ช่วยเสริมกระบวนการนี้ โดยช่วยในการสังเกตและแก้ไขการพิมพ์ผิด ความไม่ถูกต้อง และการออกแบบที่เป็นอันตรายล่วงหน้า การมุ่งเน้นไปที่การตรวจสอบโค้ดเกี่ยวกับอัลกอริธึมและความชัดเจนของโค้ดจะมีประสิทธิภาพมากกว่ามาก แทนที่จะมองหาวงเล็บที่วางผิดที่หรือ
0. ทำความรู้จักกับเครื่องมือ
ทุกอย่างเริ่มต้นด้วยเวอร์ชันทดลอง อันที่จริงมันเป็นเรื่องยากที่จะตัดสินใจที่จะแนะนำบางสิ่งเข้าสู่กระบวนการพัฒนาหากคุณไม่เคยเห็นเครื่องมือนี้มาก่อน ดังนั้นสิ่งแรกที่คุณควรทำคือดาวน์โหลด
สิ่งที่คุณจะได้เรียนรู้ในขั้นตอนนี้:
- วิธีโต้ตอบกับเครื่องวิเคราะห์มีอะไรบ้าง
- เครื่องวิเคราะห์เข้ากันได้กับสภาพแวดล้อมการพัฒนาของคุณหรือไม่?
- โครงการของคุณมีปัญหาอะไรบ้างในปัจจุบัน?
หลังจากที่คุณได้ติดตั้งทุกสิ่งที่คุณต้องการแล้ว สิ่งแรกที่คุณควรทำคือทำการวิเคราะห์โครงการทั้งหมด (
ความจริงก็คือเครื่องวิเคราะห์แบบคงที่มักจะออกคำเตือนจำนวนมากสำหรับโครงการที่มีฐานโค้ดขนาดใหญ่ ไม่จำเป็นต้องแก้ไขทั้งหมด เนื่องจากโครงการของคุณกำลังทำงานอยู่แล้ว ซึ่งหมายความว่าปัญหาเหล่านี้ไม่สำคัญ อย่างไรก็ตามคุณ
แท้จริงแล้ว คำเตือน 178 รายการนั้นง่ายต่อการดูมากกว่าคำเตือนหลายพัน...
ในแท็บ กลาง и ต่ำ มักจะมีคำเตือนที่ดี แต่หมวดหมู่เหล่านี้รวมถึงการวินิจฉัยที่มีความแม่นยำน้อยกว่า (ความน่าเชื่อถือ) ข้อมูลเพิ่มเติมเกี่ยวกับระดับคำเตือนและตัวเลือกในการทำงานภายใต้ Windows สามารถดูได้ที่นี่: *
การตรวจสอบข้อผิดพลาดที่น่าสนใจที่สุดสำเร็จแล้ว (และแก้ไขให้ถูกต้อง) ก็คุ้มค่า
1. การดูแลระบบ
หลังจากทำความคุ้นเคยแล้วก็ถึงเวลากำหนดค่าปลั๊กอินและรวมเข้ากับ CI ซึ่งจะต้องทำก่อนที่โปรแกรมเมอร์จะเริ่มใช้เครื่องวิเคราะห์แบบคงที่ ความจริงก็คือโปรแกรมเมอร์อาจลืมเปิดใช้งานการวิเคราะห์หรือไม่ต้องการทำเลย ในการดำเนินการนี้ คุณต้องทำการตรวจสอบทุกอย่างเป็นครั้งสุดท้าย เพื่อไม่ให้โค้ดที่ยังไม่ทดสอบเข้าไปในสาขาการพัฒนาทั่วไป
Что вы узнаете на данном этапе:
- เครื่องมือนี้มีตัวเลือกการทำงานอัตโนมัติอะไรบ้าง
- เครื่องวิเคราะห์เข้ากันได้กับระบบการประกอบของคุณหรือไม่?
เนื่องจากไม่มีเอกสารที่สมบูรณ์แบบ บางครั้งคุณต้องเขียนเข้ามา
ตอนนี้เรามาดูบริการการบูรณาการอย่างต่อเนื่อง (CI) กัน สามารถใช้เครื่องวิเคราะห์ใดๆ ก็ได้โดยไม่มีปัญหาร้ายแรงใดๆ ในการดำเนินการนี้ คุณจะต้องสร้างขั้นตอนแยกต่างหากในไปป์ไลน์ ซึ่งโดยปกติจะอยู่หลังการทดสอบบิลด์และยูนิต ทำได้โดยใช้ยูทิลิตี้คอนโซลต่างๆ ตัวอย่างเช่น PVS-Studio มียูทิลิตี้ดังต่อไปนี้:
PVS-Studio_Cmd.exe (การวิเคราะห์โซลูชัน, โปรเจ็กต์ C#, C++ บน Windows)CLMonitor.exe (การตรวจสอบการรวบรวม)pvs-studio-analyzer (анализ C++ проектов на Linux / macOS)pvs-studio-dotnet (анализ решений, C# проектов на Linux / macOS)pvs-studio.jar (การวิเคราะห์โครงการ Java)PlogConverter (แปลงไฟล์รายงาน)
Для интеграции анализа в CI нужно сделать три вещи:
- ติดตั้งเครื่องวิเคราะห์
- ดำเนินการวิเคราะห์
- ส่งมอบผลลัพธ์
ตัวอย่างเช่น หากต้องการติดตั้ง PVS-Studio บน Linux (Debian-base) คุณต้องรันคำสั่งต่อไปนี้:
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
บนระบบที่ใช้ Windows ไม่มีวิธีติดตั้งตัววิเคราะห์จากตัวจัดการแพ็คเกจ แต่เป็นไปได้ที่จะปรับใช้ตัววิเคราะห์จากบรรทัดคำสั่ง:
PVS-Studio_setup.exe /verysilent /suppressmsgboxes
/norestart /nocloseapplications
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการปรับใช้ PVS-Studio บนระบบที่ใช้ Windows *
หลังการติดตั้ง คุณต้องรันการวิเคราะห์โดยตรง อย่างไรก็ตาม ขอแนะนำให้ทำเช่นนี้หลังจากการคอมไพล์และการทดสอบผ่านไปแล้วเท่านั้น เนื่องจากโดยทั่วไปแล้วการวิเคราะห์แบบคงที่จะใช้เวลานานกว่าการคอมไพล์ถึงสองเท่า
เนื่องจากวิธีการเปิดใช้งานขึ้นอยู่กับแพลตฟอร์มและคุณสมบัติของโปรเจ็กต์ ฉันจะแสดงตัวเลือกสำหรับ C++ (Linux) เป็นตัวอย่าง:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w
คำสั่งแรกจะทำการวิเคราะห์ และคำสั่งที่สอง
หมายเหตุ รูปแบบข้อความไม่สะดวก มีให้ไว้เป็นตัวอย่างเท่านั้น ให้ความสนใจกับรูปแบบรายงานที่น่าสนใจยิ่งขึ้น - FullHtml ช่วยให้คุณสามารถนำทางผ่านโค้ดได้
Подробнее про настройку анализа на CI можно прочитать в статье "
เอาล่ะ คุณได้กำหนดค่าตัววิเคราะห์บนเซิร์ฟเวอร์บิลด์แล้ว ตอนนี้ หากมีคนอัปโหลดโค้ดที่ยังไม่ได้ทดสอบ ขั้นตอนการยืนยันจะล้มเหลว และคุณจะสามารถตรวจพบปัญหาได้ อย่างไรก็ตาม สิ่งนี้ไม่สะดวกนัก เนื่องจากจะมีประสิทธิภาพมากกว่าในการตรวจสอบโปรเจ็กต์ไม่ใช่หลังจากรวมสาขาแล้ว แต่ ก่อนหน้านั้นในขั้นตอนการขอดึง ก.
โดยทั่วไป การตั้งค่าการวิเคราะห์คำขอดึงข้อมูลไม่แตกต่างจากการเปิดตัวการวิเคราะห์ตามปกติบน CI มากนัก ยกเว้นความจำเป็นในการรับรายการไฟล์ที่เปลี่ยนแปลง โดยทั่วไปสามารถรับได้โดยการสอบถามความแตกต่างระหว่างสาขาโดยใช้ git:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
ตอนนี้คุณต้องส่งรายการไฟล์นี้ไปยังเครื่องวิเคราะห์เป็นอินพุต ตัวอย่างเช่น ใน PVS-Studio สิ่งนี้จะถูกนำไปใช้โดยใช้แฟล็ก -S:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับการวิเคราะห์คำขอดึงข้อมูลได้ *
ด้วยการตั้งค่าการวิเคราะห์คำขอดึง คุณสามารถบล็อกการคอมมิตที่มีคำเตือนได้ ดังนั้นจึงสร้างขอบเขตที่โค้ดที่ยังไม่ทดสอบไม่สามารถข้ามได้
ทั้งหมดนี้เป็นสิ่งที่ดีอย่างแน่นอน แต่ฉันต้องการที่จะเห็นคำเตือนทั้งหมดในที่เดียว ไม่เพียงแต่จากเครื่องวิเคราะห์แบบคงที่เท่านั้น แต่ยังมาจากการทดสอบหน่วยหรือจากเครื่องวิเคราะห์แบบไดนามิกด้วย มีบริการและปลั๊กอินต่างๆ สำหรับสิ่งนี้ ตัวอย่างเช่น PVS-Studio มี
2. บูรณาการบนเครื่องของนักพัฒนา
Теперь пришло время установки и настройки анализатора для повседневного использования при разработке. К этому моменту вы уже познакомились с большей частью способов работы, поэтому это можно назвать самой лёгкой частью.
เนื่องจากเป็นตัวเลือกที่ง่ายที่สุด นักพัฒนาจึงสามารถติดตั้งเครื่องวิเคราะห์ที่จำเป็นได้ด้วยตนเอง อย่างไรก็ตาม การดำเนินการนี้จะใช้เวลานานและเบี่ยงเบนความสนใจจากการพัฒนา ดังนั้นคุณจึงสามารถทำให้กระบวนการนี้เป็นแบบอัตโนมัติโดยใช้โปรแกรมติดตั้งและแฟล็กที่จำเป็น สำหรับ PVS-Studio นั้นมีหลากหลาย
จากนั้นคุณจะต้องติดตั้งปลั๊กอินที่จำเป็นเช่น
3. การใช้ชีวิตประจำวัน
ในขั้นตอนนี้ ถึงเวลาที่จะพูดสักสองสามคำเกี่ยวกับวิธีเร่งความเร็วเครื่องวิเคราะห์ในระหว่างการใช้งานในแต่ละวัน การวิเคราะห์ทั้งโปรเจ็กต์โดยสมบูรณ์นั้นใช้เวลานาน แต่เราจะเปลี่ยนโค้ดตลอดทั้งโปรเจ็กต์ในคราวเดียวบ่อยแค่ไหน? แทบจะไม่มีการปรับโครงสร้างใดๆ ที่มีขนาดใหญ่จนส่งผลกระทบต่อโค้ดเบสทั้งหมดทันที จำนวนไฟล์ที่เปลี่ยนแปลงในแต่ละครั้งแทบจะไม่เกินหนึ่งโหล ดังนั้นจึงควรวิเคราะห์ไฟล์เหล่านั้น สำหรับสถานการณ์เช่นนี้ก็มี
หากเครื่องวิเคราะห์ตรวจพบปัญหาในโค้ดที่เปลี่ยนแปลงล่าสุด เครื่องวิเคราะห์จะรายงานเรื่องนี้โดยอิสระ ตัวอย่างเช่น PVS-Studio จะแจ้งให้คุณทราบเกี่ยวกับเรื่องนี้โดยใช้การแจ้งเตือน:
แน่นอนว่าการบอกนักพัฒนาให้ใช้เครื่องมือนี้ยังไม่เพียงพอ เราจำเป็นต้องบอกพวกเขาว่ามันคืออะไรและเป็นอย่างไร ตัวอย่างเช่น นี่คือบทความเกี่ยวกับการเริ่มต้นอย่างรวดเร็วสำหรับ PVS-Studio แต่คุณสามารถค้นหาบทช่วยสอนที่คล้ายกันสำหรับเครื่องมือใดๆ ที่คุณต้องการ:
Как запустить PVS-Studio в Windows (C, C++, C#) วิธีรัน PVS-Studio บน Linux และ macOS (C, C++) Как запустить PVS-Studio Java
บทความดังกล่าวให้ข้อมูลทั้งหมดที่จำเป็นสำหรับการใช้งานในชีวิตประจำวันและใช้เวลาไม่นาน 🙂
แม้จะอยู่ในขั้นตอนการทำความรู้จักกับเครื่องมือนี้ เราก็ได้ระงับคำเตือนมากมายระหว่างการเปิดตัวครั้งแรกครั้งหนึ่ง น่าเสียดายที่เครื่องวิเคราะห์แบบคงที่ไม่สมบูรณ์แบบ ดังนั้น จึงให้ผลบวกลวงเป็นครั้งคราว โดยปกติแล้วจะง่ายต่อการระงับ ตัวอย่างเช่น ในปลั๊กอิน PVS-Studio สำหรับ Visual Studio คุณเพียงแค่คลิกปุ่มเดียว:
อย่างไรก็ตาม คุณสามารถทำได้มากกว่าแค่ปราบปรามพวกเขา เช่น คุณสามารถรายงานปัญหาเพื่อสนับสนุนได้ หากผลบวกลวงสามารถแก้ไขได้ ในการอัปเดตในอนาคต คุณจะสังเกตได้ว่าในแต่ละครั้งจะมีผลบวกลวงเฉพาะสำหรับโค้ดเบสของคุณน้อยลงเรื่อยๆ
หลังจากบูรณาการแล้ว
Вот мы и прошли все этапы по интеграции статического анализа в процесс разработки. Несмотря на важность настройки подобных инструментов на CI, самым главным местом запуска является именно компьютер разработчика. Ведь статический анализатор – это не судья, который говорит где-то далеко от вас, что код никуда не годится. Напротив, это помощник, который подсказывает, если вы устали и напоминает, если вы о чём-либо забыли.
จริงอยู่ที่หากไม่มีการใช้งานเป็นประจำ การวิเคราะห์แบบคงที่ไม่น่าจะทำให้การพัฒนาง่ายขึ้นอย่างมีนัยสำคัญ ท้ายที่สุดแล้ว ประโยชน์หลักของนักพัฒนาไม่ได้อยู่ที่การค้นหาส่วนที่ซับซ้อนและเป็นที่ถกเถียงของโค้ดมากนัก แต่อยู่ที่การตรวจจับตั้งแต่เนิ่นๆ ยอมรับว่าการค้นพบปัญหาหลังจากส่งการแก้ไขไปทดสอบไม่เพียงแต่ไม่เป็นที่พอใจ แต่ยังใช้เวลานานอีกด้วย การวิเคราะห์แบบคงที่เมื่อใช้เป็นประจำ จะตรวจสอบทุกการเปลี่ยนแปลงบนคอมพิวเตอร์ของคุณโดยตรง และรายงานจุดที่น่าสงสัยขณะทำงานกับโค้ด
และหากคุณหรือเพื่อนร่วมงานของคุณยังไม่แน่ใจว่าควรใช้เครื่องวิเคราะห์หรือไม่ ฉันขอแนะนำให้คุณเริ่มอ่านบทความตอนนี้เลย "
หากคุณต้องการแบ่งปันบทความนี้กับผู้ชมที่พูดภาษาอังกฤษ โปรดใช้ลิงก์การแปล: Maxim Zvyagintsev
ที่มา: will.com