-
Biên dịch C sang Rust an toàn
-
Dù ngôn ngữ Rust ngày càng phổ biến hơn, nhưng nhiều cơ sở mã quan trọng vẫn được viết bằng C và việc viết lại bằng tay là không khả thi. Do đó, việc chuyển đổi tự động từ C sang Rust nổi lên như một lựa chọn thay thế hấp dẫn.
-
Các nghiên cứu trước đây hướng tới việc xử lý ngày càng nhiều phần của C bằng cách sử dụng các tính năng của Rust (ví dụ:
unsafe). Mặc dù triển vọng tự động hóa rất hấp dẫn, nhưng việc sinh mã phụ thuộc vàounsafesẽ làm mất hiệu lực bảo đảm an toàn bộ nhớ mà Rust cung cấp, và vì vậy lợi ích chính của việc chuyển cơ sở mã hiện có sang một ngôn ngữ an toàn bộ nhớ sẽ biến mất. -
Chúng tôi nghiên cứu một con đường khác: dịch C sang Rust an toàn, tức là tạo mã tuân thủ hệ thống kiểu của Rust để dễ dàng bảo đảm tính an toàn bộ nhớ.
-
Nghiên cứu của chúng tôi có một số đóng góp mới:
- dịch theo hướng kiểu cho một phần C sang Rust an toàn
- một phân tích tĩnh mới dựa trên "cây phân hoạch" cho phép biểu diễn phép toán con trỏ của C bằng cách sử dụng slice và các thao tác tách của Rust
- phân tích suy luận chính xác những borrow nào cần là mutable
- một chiến lược biên dịch cho kiểu cấu trúc C tương thích với phân loại cấp phát không sở hữu và sở hữu của Rust
-
Chúng tôi áp dụng phương pháp này cho các cơ sở mã C đã được chứng minh hình thức hiện có: thư viện mã hóa HACL* và bộ phân tích cú pháp và tuần tự hóa nhị phân của EverParse. Kết quả cho thấy tập con C được hỗ trợ là đủ để dịch hai ứng dụng này sang Rust an toàn.
-
Trong đánh giá, một số trường hợp vi phạm quy tắc aliasing của Rust có thể được xử lý đủ bằng các chỉnh sửa ngoại khoa tự động, và ảnh hưởng của một số sao chép mang tính chiến lược được chèn vào đối với hiệu năng là không đáng kể.
-
Đặc biệt, khi áp dụng cách tiếp cận này cho HACL*, một thư viện mã hóa đã được xác minh với 80.000 dòng và cài đặt tất cả các thuật toán hiện đại đã được viết hoàn toàn bằng Rust. Đây là trường hợp đầu tiên trên thế giới.
1 bình luận
Bình luận Hacker News
Khi chuyển dự án sang Rust, tôi rút ra một số kết luận
Codebase C đã được chứng minh về mặt hình thức và codebase C hệ thống thông thường là khác nhau
Năm 2002, các nhà nghiên cứu đã công bố một bài báo về Cyclone, một phương ngữ C an toàn, và khi port mã từ C sang Cyclone họ đã phát hiện các lỗi an toàn
Chỉ dịch đơn giản sang Rust có thể tạo ra cả phần an toàn và không an toàn, và công việc thủ công có thể tập trung xác minh tính an toàn của vùng không an toàn
Tôi không đặt nhiều kỳ vọng vào cách tiếp cận biên dịch một phần nhỏ của C
Tò mò về so sánh với khả năng chuyển đổi C của Zig
Câu hỏi liệu
C2Rustcó thể tạo mã đúng về hình thức hay khôngNếu một thư viện C hoạt động được, việc chuyển đổi với việc tận dụng phần không an toàn của Rust có thể vẫn đáng giá
Điều thú vị là mức tối ưu hóa cao không làm tăng đáng kể tốc độ của Rust