Bản port Rust chưa phát hành của Bun sở hữu 13.365 khối unsafe

Phần mềm22 tháng 5, 2026·3 phút đọc

Một cuộc kiểm toán chi tiết về bản chuyển đổi sang ngôn ngữ Rust của Bun đã phát hiện 13.365 khối mã 'unsafe'. Phân tích cho thấy hai phần ba số lượng này xuất phát từ ba nguyên nhân chính: tối ưu hóa hiệu suất, quá trình port từ Zig và ranh giới FFI.

Bản port Rust chưa phát hành của Bun sở hữu 13.365 khối unsafe

Bản port Rust chưa phát hành của Bun sở hữu 13.365 khối unsafe

Một cuộc kiểm toán chi tiết về bản chuyển đổi sang ngôn ngữ Rust của Bun đã phát hiện 13.365 khối mã "unsafe". Phân tích cho thấy hai phần ba số lượng này xuất phát từ ba nguyên nhân chính: tối ưu hóa hiệu suất, quá trình port từ Zig và ranh giới FFI.

Tổng quan về kiểm toán mã nguồn

Bun, công cụ runtime JavaScript và bundler nổi tiếng về tốc độ, đang trong quá trình chuyển đổi mã nguồn sang ngôn ngữ lập trình Rust. Tuy nhiên, một báo cáo kiểm toán gần đây cho thấy bản port này hiện đang chứa tới 13.365 khối mã unsafe.

Mật độ của mã unsafe, được đo bằng số lượng trên mỗi 1.000 dòng code Rust, thường phản ánh mức độ gần gũi của mã với ranh giới ngôn ngữ C. Một crate chỉ đóng vai trò binding cho một engine C++ sẽ có mật độ unsafe cao nhất, trong khi một runtime viết engine riêng bằng Rust sẽ có mật độ thưa thớt hơn.

Nguyên nhân gốc rễ

Theo dữ liệu được thu thập, hai phần ba số lượng khối unsafe này tập trung vào ba nguyên nhân chính:

  • Hiệu suất (Performance): Việc sử dụng unsafe để tối ưu hóa tốc độ thực thi.
  • Bản port từ Zig: Mã nguồn được chuyển đổi từ dự án Zig ban đầu.
  • Ranh giới FFI (Foreign Function Interface): Các điểm giao tiếp giữa Rust và các thư viện C/C++.

Bun lựa chọn cách tiếp cận giữ các binding và runtime trong cùng một workspace. Ngược lại, Deno tách biệt phần binding thành crate rusty_v8 và viết phần lớn runtime bằng TypeScript. Sự khác biệt trong kiến trúc này dẫn đến sự khác biệt đáng kể về cấu trúc mã unsafe giữa hai dự án.

Khả năng khắc phục và phân tích

Trong số 13.365 điểm unsafe được tìm thấy, các nhà phát triển đã phân loại khả năng xử lý chúng. Kết quả cho thấy khoảng 9.300 điểm có thể chuyển đổi sang mã an toàn (safe). Tuy nhiên, vẫn còn khoảng 4.000 điểm buộc phải giữ nguyên trạng thái unsafe (được đánh dấu màu xanh và xám trong biểu đồ) vì chúng nằm sau các lớp bao bọc (wrapper) hoặc liên quan trực tiếp đến các invariant mà trình biên dịch Rust không thể kiểm chứng.

Các mẫu phổ biến nhất bao gồm các máy trạng thái *mut Self và các ép kiểu &self sang &mut.

"Một điểm được coi là đã sửa chỉ khi mã an toàn không thể gây ra hành vi không xác định trong bản build release. Các assertion ở chế độ debug không đủ điều kiện, cũng như các wrapper chỉ đơn giản là che giấu invariant."

Dữ liệu này được lấy tại commit 3eb0fda021, trước khi bản port Rust chính thức được phát hành trong bản release ổn định. Con số này có thể thay đổi khi quá trình phát triển và tinh chỉnh mã nguồn tiếp tục diễn ra.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗