Rust ปลอดภัยจริงหรือ?
C++ ไม่ปลอดภัยขนาดนั้นจริงหรือ?
มีวิดีโอบรรยายใน YouTube หัวข้อที่น่าสนใจ เลยนำมาฝากกันครับ
ถ้าแปลชื่อเรื่องก็จะได้อารมณ์ประมาณว่า “การบอกให้ใช้ภาษาที่ปลอดภัยต่อหน่วยความจำไม่ใช่เรื่องที่ง่ายขนาดนั้น”
ผู้บรรยายกำลังอธิบายมุมมองของตนเองจากจุดยืนที่ค่อนข้างเป็นธรรมและไม่เอนเอียงไปด้านใดด้านหนึ่ง
- Rust ป้องกันการรันโค้ดที่ไม่ปลอดภัยต่อหน่วยความจำด้วย panic แต่ “unsafe Rust” สามารถเลี่ยงกลไกป้องกันเหล่านี้ได้
- อย่างไรก็ตาม unsafe Rust ต้องมีการ opt-in อย่างชัดเจน จึงสังเกตเห็นได้ง่ายกว่า C/C++ ที่ไม่ปลอดภัย และสามารถโฟกัสตรวจทานเฉพาะส่วนนี้ได้
- ประมาณ 30% ของ Rust crates ใช้โค้ดที่ไม่ปลอดภัย และในระบบ embedded ตัวเลขนี้สูงกว่าราวสองเท่า
- Sanitizer (เครื่องมือวิเคราะห์แบบไดนามิก) สามารถตรวจจับข้อผิดพลาดด้านหน่วยความจำได้ทั้งในโค้ด Rust และ C/C++
- นักพัฒนา Rust ราว 70% เรียกใช้โค้ดที่ไม่ปลอดภัยผ่าน FFI (foreign function interface) กับไลบรารี C/C++
- ไลบรารีสำคัญหลายตัวที่ใช้ในโปรเจกต์ Rust ก็เขียนด้วย C/C++ เช่น SQLite และไลบรารี OPCUA
- หากมีซอร์สโค้ด Sanitizers สามารถวิเคราะห์ทั้งโค้ด Rust และ C/C++ ได้ที่ชั้น LLVM IR
- Miri เป็นเครื่องมือเสริมสำหรับตรวจจับ undefined behavior ของ Rust ที่ระดับ intermediate representation
- ข้อดีของ Miri: ให้ข้อผิดพลาดที่ชัดเจนและตรวจสอบ undefined behavior ทุกแบบได้พร้อมกัน ข้อจำกัด: ไม่สามารถตีความโค้ด C/C++ ได้
- ฟังก์ชันใน Rust standard library ราว 20% ใช้โค้ดที่ไม่ปลอดภัย
- โครงสร้างพื้นฐานสำคัญไม่ได้ต้องการแค่โค้ดที่ปลอดภัยต่อหน่วยความจำ แต่ต้องการโค้ดที่ถูกต้องเพื่อป้องกันความเสียหายต่อทรัพย์สินหรือภัยคุกคามต่อชีวิต
- แม้แต่โปรแกรม Rust ที่ปลอดภัยก็ยังอาจทำงานผิดพลาดหรือเสี่ยงต่อการโจมตีแบบปฏิเสธการให้บริการได้
- Property testing สามารถช่วยได้ด้วยการสร้างอินพุตแบบสุ่มเพื่อค้นหากรณีขอบเขต แต่ก็มีปัญหากับข้อผิดพลาดที่เกิดขึ้นได้ยากมาก
- Kani เป็น model checker ที่ใช้คณิตศาสตร์เพื่อตรวจสอบความถูกต้องของโปรแกรมภายใต้ข้อจำกัดที่กำหนด
- ข้อดีของ Kani: ประเมินอินพุตทั้งหมดภายใต้ข้อจำกัดด้วยวิธีทางคณิตศาสตร์ ข้อจำกัด: ต้อง unroll loop และไม่รองรับ concurrency หรือ C/C++ FFI
- ข้อสรุปเกี่ยวกับ Rust: Rust ปลอดภัย แต่ก็ไม่ได้ปลอดภัยอย่างที่หลายคนคิด
- Bjarne Stroustrup แยก C ออกจาก C++ และกล่าวว่า C++ ถูกออกแบบมาเพื่อให้เขียนโค้ดได้ปลอดภัยกว่า
- C++ Core Guidelines มีโปรไฟล์ด้าน type safety, bounds safety และ lifetime safety ซึ่งช่วยให้เข้าใกล้การรับประกันแบบ Rust ได้
- ปัญหาใหญ่ที่สุดของ C++ คือโดยพื้นฐานแล้วมันเขียนโค้ดที่ไม่ปลอดภัยได้ง่ายเกินไป ไม่ใช่ว่านักพัฒนาไม่พยายาม
ยังไม่มีความคิดเห็น