โครงการ LLVM พัฒนาการจัดการบัฟเฟอร์ที่ปลอดภัยในภาษา C ++

ผู้พัฒนาโครงการ LLVM ได้เสนอการเปลี่ยนแปลงหลายประการโดยมีวัตถุประสงค์เพื่อเสริมสร้างความปลอดภัยของโครงการ C ++ ที่มีความสำคัญต่อภารกิจ และจัดหาวิธีการในการกำจัดข้อผิดพลาดที่เกิดจากการบัฟเฟอร์มากเกินไป งานนี้มุ่งเน้นไปที่สองด้าน ได้แก่ การจัดหาโมเดลการพัฒนาที่ช่วยให้ทำงานอย่างปลอดภัยด้วยบัฟเฟอร์ และการทำงานเพื่อเพิ่มความปลอดภัยให้กับไลบรารีฟังก์ชันมาตรฐาน libc++

โมเดลการเขียนโปรแกรมที่ปลอดภัยที่นำเสนอสำหรับ C++ เกี่ยวข้องกับการใช้คลาสที่จัดทำโดยไลบรารีมาตรฐานเมื่อทำงานกับบัฟเฟอร์แทนการจัดการพอยน์เตอร์เปล่า ตัวอย่างเช่น ขอเสนอให้ใช้คลาส std::array, std::vector และ std::span ซึ่งจะเพิ่มการตรวจสอบรันไทม์สำหรับหน่วยความจำที่จัดสรรมากเกินไป

เพื่อต่อสู้กับแนวทางการเขียนโปรแกรมที่เป็นอันตรายในเสียงดังกราว ขอเสนอให้แสดงคำเตือนคอมไพเลอร์สำหรับการดำเนินการทางคณิตศาสตร์ของพอยน์เตอร์ทั้งหมด คล้ายกับเอาท์พุตคำเตือน clang-tidy linter เมื่อใช้แฟล็ก "cppcoreguidelines-pro-bounds-pointer-arithmetic" ซึ่งสนับสนุนที่จะ ปรากฏในรีลีส LLVM 16 หากต้องการเปิดใช้งานคำเตือนดังกล่าว จะมีการเพิ่มแฟล็กแยกต่างหากให้กับ clang ซึ่งจะไม่ทำงานตามค่าเริ่มต้น

มีการวางแผนที่จะใช้โหมดการป้องกันขั้นสูงที่เป็นทางเลือกใน libc++ ซึ่งเมื่อเปิดใช้งาน จะตรวจจับบางสถานการณ์ขณะรันไทม์ที่นำไปสู่พฤติกรรมที่ไม่ได้กำหนดไว้ ตัวอย่างเช่น ในคลาส std::span และ std::vector การเข้าถึงหน่วยความจำนอกขอบเขตจะถูกตรวจสอบ และหากตรวจพบ โปรแกรมก็จะเสียหาย นักพัฒนาเชื่อว่าการเพิ่มการเปลี่ยนแปลงดังกล่าวจะทำให้ libc++ เป็นไปตามมาตรฐาน C++ เนื่องจากทางเลือกของวิธีจัดการกับกรณีของพฤติกรรมที่ไม่ได้กำหนดไว้นั้นขึ้นอยู่กับนักพัฒนาไลบรารี ซึ่งอาจเหนือสิ่งอื่นใดคือถือว่าพฤติกรรมที่ไม่ได้กำหนดเป็นความล้มเหลว โดยกำหนดให้ โปรแกรมที่จะยุติ

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

นอกจากนี้ ยังมีการวางแผนในการเตรียมเครื่องมือสำหรับการปรับโค้ด ซึ่งช่วยให้คุณสามารถแทนที่ตัวแปรด้วยพอยน์เตอร์เปล่าด้วยคอนเทนเนอร์ และใช้ตัวจัดการทางเลือกในสถานการณ์ที่คอนเทนเนอร์ไม่สามารถแทนที่พอยน์เตอร์ได้โดยตรง (เช่น โครงสร้าง “if(array_pointer)” สามารถ ถูกแปลงเป็น “if(span.data) ()") การปรับสามารถนำมาใช้ได้ไม่เพียงแต่กับตัวแปรในเครื่องเท่านั้น แต่ยังรวมถึงพารามิเตอร์ของประเภทตัวชี้ด้วย

ที่มา: opennet.ru

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