วิธีคอมไพล์ C ให้เป็น Rust ที่ปลอดภัย
(arxiv.org)-
การคอมไพล์ C ให้เป็น Rust ที่ปลอดภัย
-
แม้ว่า Rust จะได้รับความนิยมเพิ่มขึ้นอย่างรวดเร็ว แต่ฐานโค้ดที่สำคัญจำนวนมากยังคงถูกเขียนด้วย C และการเขียนใหม่ด้วยตนเองไม่สามารถทำได้จริง ดังนั้นการแปลง C เป็น Rust อัตโนมัติจึงกลายเป็นทางเลือกที่น่าสนใจ
-
การวิจัยหลายชิ้นก่อนหน้าได้พัฒนาทางด้านการใช้ความสามารถหลากหลายของ Rust มากขึ้นเรื่อย ๆ (เช่น
unsafe) เพื่อจัดการส่วนต่าง ๆ ของ C อย่างต่อเนื่องมากขึ้น แม้แนวโน้มการอัตโนมัติจะน่าดึงดูด แต่การสร้างโค้ดที่พึ่งพาunsafeจะทำให้การรับประกันความปลอดภัยด้านหน่วยความจำที่ Rust มอบให้ออกใช้งานไม่ได้ และดังนั้นประโยชน์หลักของการย้ายฐานโค้ดเดิมไปยังภาษาที่ปลอดภัยด้านหน่วยความจำจึงหายไป -
เราจึงสำรวจแนวทางทางเลือกสำหรับการแปล C เป็น Rust ที่ปลอดภัย กล่าวคือ การสร้างโค้ดที่ปฏิบัติตามระบบชนิดของ Rust เพื่อให้สามารถรับประกันความปลอดภัยด้านหน่วยความจำได้อย่างง่ายดาย
-
งานของเรามีส่วนร่วมเชิงนวัตกรรมหลายประการ:
- การแปลเชิงชนิดของบางส่วนของ C เป็น Rust ที่ปลอดภัย
- การวิเคราะห์เชิงคงที่ใหม่แบบต้นไม้การแบ่ง โดยใช้ slice และการดำเนินการแบ่งของ Rust เพื่อแทนการคำนวณพอยน์เตอร์ของ C
- การวิเคราะห์ที่สามารถอนุมานได้อย่างแม่นยำว่าการยืมใดควรเป็นแบบเปลี่ยนแปลงได้
- กลยุทธ์การคอมไพล์สำหรับชนิดโครงสร้างของ C ที่เข้ากันได้กับการแยกแยะการจัดสรรเป็นเจ้าของและไม่เป็นเจ้าของของ Rust
-
เราได้นำแนวทางนี้ไปใช้กับฐานโค้ด C ที่ผ่านการตรวจสอบแบบทางการที่มีอยู่แล้ว ได้แก่ ไลบรารีเข้ารหัส HACL* และตัวแยกวิเคราะห์และตัวทำให้เป็นลำดับแบบไบนารีของ EverParse โดยแสดงให้เห็นว่าชุดย่อยของ C ที่รองรับนั้นเพียงพอสำหรับการแปลแอปพลิเคชันทั้งสองเป็น Rust ที่ปลอดภัย
-
ผลการประเมินพบว่า สำหรับบางส่วนที่ละเมิดข้อกำหนดเรื่อง aliasing ของ Rust สามารถแก้ด้วยการแก้ไขเฉพาะจุดแบบอัตโนมัติได้ และผลกระทบต่อประสิทธิภาพจากการเพิ่มกลยุทธ์สำเนาเชิงกลยุทธ์บางส่วนยังมีน้อยมาก
-
โดยเฉพาะอย่างยิ่ง เมื่อใช้แนวทางนี้กับ HACL* ผลลัพธ์คือไลบรารีการเข้ารหัสที่ผ่านการพิสูจน์แล้ว 80,000 บรรทัด ซึ่งครอบคลุมอัลกอริทึมสมัยใหม่ทั้งหมด ถูกเขียนขึ้นด้วย Rust อย่างบริสุทธิ์ ซึ่งเป็นกรณีแรก
1 ความคิดเห็น
ความคิดเห็นของ Hacker News
ผมได้ข้อสรุปบางประการขณะพอร์ตโปรเจกต์ไปใช้ Rust
ฐานโค้ด C ที่ผ่านการตรวจสอบอย่างเป็นทางการกับฐานโค้ดระบบ C ทั่วไปนั้นแตกต่างกัน
ในปี 2002 มีงานวิจัยเสนอเรื่อง Cyclone ซึ่งเป็น C dialect ที่ปลอดภัย และเมื่อย้ายโค้ดจาก C ไป Cyclone ก็พบ bug ที่เกี่ยวกับความปลอดภัย
การแปลตรง ๆ ไปยัง Rust สามารถสร้างทั้งส่วนที่ปลอดภัยและไม่ปลอดภัยได้ โดยงาน manual จึงอาจโฟกัสไปที่การยืนยันความปลอดภัยของพื้นที่ที่ไม่ปลอดภัย
ความคาดหวังเกี่ยวกับแนวทางที่คอมไพล์เฉพาะส่วนเล็ก ๆ ของ C นั้นไม่สูงมาก
มีคำถามเกี่ยวกับการเปรียบเทียบกับความสามารถในการแปลง C ของ Zig
คำถามเรื่องว่า
C2Rustสามารถสร้างโค้ดที่ถูกต้องตามหลักการอย่างเป็นทางการได้หรือไม่หากไลบรารี C เดิมยังใช้งานได้ การแปลโดยใช้
unsafeของ Rust อาจมีคุณค่าน่าสนใจที่ระดับ optimization สูงไม่ได้ช่วยเพิ่มความเร็วของ Rust มาก