AI Automation

Chuyển từ C/C++ sang Rust: không cần viết lại tất cả

Tóm tắt

Lỗ hổng phân rã theo tuổi code nên Android chỉ viết code mới bằng ngôn ngữ an toàn bộ nhớ, và tỷ lệ lỗi bộ nhớ giảm từ 76% xuống dưới 20%. Lộ trình: đo hiện trạng, chặn lỗi mới, viết lại chọn lọc phần xử lý input, làm cứng phần còn lại.

"Viết lại toàn bộ bằng Rust" nghe hấp dẫn, nhưng với codebase hàng triệu dòng C/C++ thì gần như không khả thi: tốn nhiều năm, dừng phát triển tính năng, và bản viết lại có lỗi mới của riêng nó. Tin tốt là bạn không cần làm vậy. Dữ liệu của Android cho thấy một chiến lược rẻ hơn nhiều mà hiệu quả bất ngờ: viết code mới bằng ngôn ngữ an toàn bộ nhớ, để code cũ yên. Cơ quan an ninh mạng của Mỹ và đồng minh cũng khuyên doanh nghiệp công bố lộ trình theo hướng này.

Phát hiện then chốt: lỗ hổng "phân rã" theo tuổi code

  • Phần lớn lỗ hổng nằm ở code mới hoặc vừa sửa. Code càng cũ, càng được dùng và kiểm thử lâu, mật độ lỗi càng giảm theo hàm mũ, giống chu kỳ bán rã.
  • Từ khoảng 2019, Android ưu tiên viết code mới bằng ngôn ngữ an toàn bộ nhớ, không viết lại code cũ.
  • Kết quả: tỷ lệ lỗi an toàn bộ nhớ trong lỗ hổng Android giảm từ 76% (2019) xuống 24% (2024), và theo số liệu sơ bộ 2025 lần đầu xuống dưới 20%, dù phần lớn code hiện có vẫn là C/C++.

Hệ quả: đổi ngôn ngữ cho code mới mang lại lợi ích sớm hơn nhiều so với trực giác.

Lộ trình bốn bước

  1. Đo hiện trạng: phân loại lỗ hổng theo loại và thành phần; xác định bao nhiêu phần trăm là lỗi bộ nhớ.
  2. Chặn dòng lỗi mới: quy định code mới viết bằng Rust (hoặc ngôn ngữ an toàn bộ nhớ khác phù hợp), bắt đầu từ thành phần mới.
  3. Thay thế có chọn lọc: ưu tiên viết lại phần rủi ro cao nhất: parser, codec, xử lý dữ liệu từ mạng hoặc file không tin cậy.
  4. Làm cứng phần còn lại: code C/C++ cũ tiếp tục dùng fuzzing, sanitizer, sandbox và các thư viện có kiểm tra.

Lộ trình theo khuyến nghị CISA/NSA

Hướng dẫn "The Case for Memory Safe Roadmaps" (CISA, NSA, FBI và cơ quan an ninh mạng các nước Úc, Canada, Anh, New Zealand) khuyên nhà sản xuất phần mềm công bố lộ trình, gồm: các giai đoạn có mốc thời gian và kết quả cụ thể, ngày bắt đầu dùng ngôn ngữ an toàn bộ nhớ cho hệ thống mới, đào tạo lập trình viên, và kế hoạch tương tác giữa code cũ và mới.

Cho Rust và C/C++ sống chung

Công cụDùng khi
FFI + bindgenGọi thư viện C có sẵn từ Rust
cxxGọi qua lại an toàn giữa Rust và C++, định nghĩa ranh giới bằng một bridge
Thay từng thành phầnGiữ nguyên API, thay phần triển khai bên trong bằng Rust

Ranh giới FFI là nơi dễ lỗi nhất: dữ liệu đi qua đó không còn được trình biên dịch Rust bảo vệ hoàn toàn, nên cần review kỹ.

Dịch tự động bằng AI?

DARPA có chương trình TRACTOR nhằm tự động dịch C sang Rust với chất lượng như lập trình viên Rust giỏi, kết hợp phân tích tĩnh, phân tích động và LLM. Các trợ lý như Claude Code cũng dịch được từng module nhỏ. Nhưng output máy dịch thường dùng nhiều unsafe hoặc không đúng phong cách Rust; hãy coi đó là bản nháp, có test so sánh hành vi với bản C và review như code người viết.

Rủi ro và lưu ý

  • Đường cong học tập: ownership và borrowing cần thời gian; Google có khoá Comprehensive Rust miễn phí dùng để đào tạo nội bộ.
  • Hệ sinh thái và toolchain: nền tảng nhúng, trình biên dịch đặc thù có thể chưa hỗ trợ đủ.
  • Đừng viết lại để "sạch": code cũ ổn định, ít lỗi thì viết lại có thể tạo thêm lỗi.
  • Đo kết quả: theo dõi tỷ lệ lỗi bộ nhớ trong lỗ hổng mới mỗi quý để chứng minh lộ trình có tác dụng.

Áp dụng thế nào?

  • Dev: Chọn một module nhỏ, độc lập, xử lý input bên ngoài để viết bằng Rust đầu tiên; dùng cxx hoặc FFI để tích hợp.
  • Tech Lead: Viết quy định "code mới dùng Rust" kèm danh sách ngoại lệ rõ ràng; thiết lập CI cho Rust (clippy, test, audit dependency).
  • PM: Lập roadmap an toàn bộ nhớ có mốc thời gian theo khung CISA; báo cáo tỷ lệ lỗi bộ nhớ như một chỉ số chất lượng.

Nguồn & tham khảo

  1. Eliminating Memory Safety Vulnerabilities at the Source — Google Security Blog
  2. Rust in Android: move fast and fix things — Google Security Blog
  3. The Case for Memory Safe Roadmaps — CISA, NSA, FBI and partners
  4. CXX: safe interop between Rust and C++ — cxx.rs
  5. TRACTOR: Translating All C to Rust — DARPA
  6. Comprehensive Rust — Google