Rust có thực sự an toàn không?
C++ có thực sự không an toàn đến vậy không?
Tôi thấy có một bài thuyết trình trên YouTube về một chủ đề khá thú vị nên mang về chia sẻ.
Nếu dịch tiêu đề thì sắc thái sẽ giống như: “Bảo người ta dùng ngôn ngữ an toàn bộ nhớ” không phải là một vấn đề đơn giản đến thế.
Diễn giả đang nói lên suy nghĩ của mình từ một lập trường tương đối công bằng, không thiên hẳn về bên nào.
- Rust ngăn việc thực thi mã không an toàn bộ nhớ thông qua panic, nhưng
unsafe Rustcó thể vượt qua những cơ chế bảo vệ này. - Tuy nhiên,
unsafe Rustđòi hỏi phải opt-in một cách tường minh, nên nó dễ bị nhận ra hơn so với C/C++ không an toàn. Có thể tập trung rà soát kỹ phần này. - Khoảng 30% crate Rust sử dụng mã không an toàn, và trong hệ thống nhúng thì tỷ lệ này cao gấp đôi.
- Sanitizer (công cụ phân tích động) có thể phát hiện lỗi bộ nhớ trong cả mã Rust lẫn C/C++.
- 70% nhà phát triển Rust gọi mã không an toàn thông qua FFI (giao diện hàm ngoại) tới các thư viện C/C++.
- Nhiều thư viện quan trọng cũng được dùng trong các dự án Rust được viết bằng C/C++ (SQLite, thư viện OPCUA).
- Nếu có mã nguồn, Sanitizer có thể phân tích cả mã Rust và C/C++ ở tầng LLVM IR.
- Miri là một công cụ bổ trợ để phát hiện hành vi không xác định của Rust ở biểu diễn trung gian.
- Ưu điểm của Miri: cung cấp lỗi rõ ràng và kiểm tra đồng thời mọi hành vi không xác định. Hạn chế: không thể diễn giải mã C/C++.
- Khoảng 20% hàm trong thư viện chuẩn Rust sử dụng mã không an toàn.
- Với hạ tầng quan trọng, không chỉ cần mã an toàn bộ nhớ mà còn cần mã đúng đắn để tránh thiệt hại tài sản hoặc đe dọa tính mạng.
- Ngay cả chương trình Rust an toàn cũng có thể hoạt động sai hoặc dễ bị tấn công từ chối dịch vụ.
- Kiểm thử theo thuộc tính có thể hữu ích bằng cách tạo đầu vào ngẫu nhiên để tìm các trường hợp biên, nhưng gặp khó khăn với những lỗi không thể tái hiện.
- Kani là một model checker dùng toán học để xác minh tính đúng đắn của chương trình trong phạm vi các ràng buộc.
- Ưu điểm của Kani: đánh giá một cách toán học mọi đầu vào trong phạm vi ràng buộc. Hạn chế: phải unroll vòng lặp, và không hỗ trợ đồng thời hay C/C++ FFI.
- Kết luận về Rust: Rust an toàn, nhưng không an toàn nhiều như người ta nghĩ.
- Bjarne Stroustrup phân biệt C và C++, và nhắc rằng C++ được thiết kế để hướng tới mã an toàn hơn.
- C++ Core Guidelines cung cấp các profile về an toàn kiểu, an toàn biên và an toàn vòng đời để tiến gần đến các đảm bảo của Rust.
- Vấn đề lớn nhất của C++ là mặc định quá dễ viết ra mã không an toàn; không phải vì các nhà phát triển không cố gắng.
Chưa có bình luận nào.