การเปิดตัว ControlFlag 1.0 ซึ่งเป็นเครื่องมือสำหรับระบุข้อผิดพลาดในโค้ด C

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

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

การเปิดตัว ControlFlag 1.0 ซึ่งเป็นเครื่องมือสำหรับระบุข้อผิดพลาดในโค้ด C

เพื่อเป็นตัวอย่างความสามารถของ ControlFlag นักพัฒนาได้วิเคราะห์ซอร์สโค้ดของโปรเจ็กต์ OpenSSL และ cURL:

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

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

ที่มา: opennet.ru

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