2 điểm bởi GN⁺ 2024-12-22 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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ào unsafe sẽ 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

 
GN⁺ 2024-12-22
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

    • Chuyển chương trình C sang Rust giúp phát hiện lỗi rất nhanh nhờ các ràng buộc chặt chẽ của Rust
    • Việc chuyển đổi tự động từ C sang Rust không phải bài toán đã được giải quyết trọn vẹn vì thiết kế nền tảng của hai ngôn ngữ khác nhau
    • Trong một số trường hợp, việc port từ C sang Rust có thể không khả thi do sự không an toàn vốn có trong bản thiết kế
    • Sự phát triển của các công cụ sẽ giúp quá trình port trôi chảy hơ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

    • Những chuyển đổi thủ công hoặc tự động như vậy có thể gia tăng việc chấp nhận ngôn ngữ an toàn và có khả năng phát hiện các lỗi hiện có
  • 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

    • Ngay cả khi phần không an toàn khá lớn, vẫn có thể có lợi ích
  • 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

    • Bởi vì mô hình ownership của Rust quá khác biệt so với chương trình C thực tế
  • Tò mò về so sánh với khả năng chuyển đổi C của Zig

    • Zig tạo môi trường hỗn hợp giữa mã mới và mã C hiện có khá tốt và thậm chí có thể dùng như một trình biên dịch C
    • Tò mò tại sao những người bảo trì Linux kernel không xem Zig như một phương án thay thế cho C
  • Câu hỏi liệu C2Rust có thể tạo mã đúng về hình thức hay không

    • Không thấy liên kết nào tới mã nguồn dùng để sinh mã Rust
  • Nế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á

    • Rust nói chung thiếu thư viện
  • Đ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

    • Tò mò không biết biên dịch trực tiếp từ C sang Rust ở mức tối ưu hóa O3 sẽ hoạt động tốt đến đâu