Intel เปิดโค้ดระบบการเรียนรู้ของเครื่อง ControlFlag เพื่อระบุจุดบกพร่องในโค้ด

Intel ได้ค้นพบการพัฒนาที่เกี่ยวข้องกับโครงการวิจัย ControlFlag ที่มุ่งสร้างระบบการเรียนรู้ของเครื่องเพื่อปรับปรุงคุณภาพของโค้ด ชุดเครื่องมือที่จัดทำโดยโปรเจ็กต์ช่วยให้สามารถระบุข้อผิดพลาดและความผิดปกติต่างๆ ในข้อความต้นฉบับที่เขียนด้วยภาษาระดับสูง เช่น C/C++ โดยอิงตามแบบจำลองที่ได้รับการฝึกอบรมเกี่ยวกับโค้ดที่มีอยู่จำนวนมาก ระบบนี้เหมาะสำหรับการระบุปัญหาประเภทต่างๆ ในโค้ด ตั้งแต่การระบุการพิมพ์ผิดและการรวมประเภทที่ไม่ถูกต้อง ไปจนถึงการระบุการตรวจสอบค่า NULL ที่ขาดหายไปในพอยน์เตอร์และปัญหาหน่วยความจำ รหัส ControlFlag เขียนด้วยภาษา C++ และเป็นโอเพ่นซอร์สภายใต้ใบอนุญาต MIT

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

รหัสที่อยู่ระหว่างการตรวจสอบจะผ่านกระบวนการที่คล้ายกันในการระบุรูปแบบที่ได้รับการตรวจสอบกับแผนผังการตัดสินใจอ้างอิง ความแตกต่างอย่างมากกับกิ่งที่อยู่ใกล้เคียงบ่งชี้ว่ามีความผิดปกติในรูปแบบที่กำลังตรวจสอบ ระบบยังช่วยให้คุณไม่เพียงแต่ระบุข้อผิดพลาดในเทมเพลตเท่านั้น แต่ยังแนะนำการแก้ไขอีกด้วย ตัวอย่างเช่นในโค้ด OpenSSL มีการระบุโครงสร้าง "(s1 == NULL) ∧ (s2 == NULL)" ซึ่งปรากฏในแผนผังไวยากรณ์เพียง 8 ครั้งในขณะที่สาขาที่ใกล้ที่สุดที่มีค่า "(s1 == โมฆะ) || (s2 == NULL)” เกิดขึ้นประมาณ 7 ครั้ง ระบบยังตรวจพบความผิดปกติ “(s1 == NULL) | (s2 == NULL)” ซึ่งปรากฏ 32 ครั้งในแผนผัง

Intel เปิดโค้ดระบบการเรียนรู้ของเครื่อง ControlFlag เพื่อระบุจุดบกพร่องในโค้ด

เมื่อวิเคราะห์ส่วนของโค้ด “ถ้า (x = 7) y = x;” ระบบได้กำหนดว่าโดยปกติแล้วโครงสร้าง "ตัวแปร == number" จะใช้ในตัวดำเนินการ "if" เพื่อเปรียบเทียบค่าตัวเลข ดังนั้นจึงมีความเป็นไปได้สูงที่ตัวบ่งชี้ "variable = number" ในนิพจน์ "if" มีสาเหตุมาจาก พิมพ์ผิด เครื่องวิเคราะห์แบบคงที่แบบดั้งเดิมอาจพบข้อผิดพลาดดังกล่าว แต่ต่างจากพวกเขาตรงที่ ControlFlag ไม่ได้ใช้กฎสำเร็จรูปซึ่งเป็นเรื่องยากที่จะจัดเตรียมตัวเลือกที่เป็นไปได้ทั้งหมด แต่ขึ้นอยู่กับสถิติของการใช้โครงสร้างต่าง ๆ ในจำนวนมาก ของโครงการ

จากการทดลอง การใช้ ControlFlag ในซอร์สโค้ดของยูทิลิตี้ cURL ซึ่งมักถูกอ้างถึงเป็นตัวอย่างของโค้ดคุณภาพสูงและผ่านการทดสอบแล้ว ข้อผิดพลาดที่ตรวจไม่พบโดยเครื่องวิเคราะห์แบบคงที่จะถูกระบุเมื่อใช้องค์ประกอบโครงสร้าง “s->keepon” ซึ่งมีประเภทตัวเลข แต่ถูกเปรียบเทียบกับค่าบูลีน TRUE ในโค้ด OpenSSL นอกเหนือจากปัญหาที่กล่าวข้างต้นด้วย "(s1 == NULL) ∧ (s2 == NULL)" แล้ว ความผิดปกติยังถูกระบุในนิพจน์ "(-2 == rv)" (เครื่องหมายลบคือ พิมพ์ผิด) และ "BIO_puts(bp, ///)

ที่มา: opennet.ru

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