- Fil-C, một trình biên dịch C/C++ mới có an toàn bộ nhớ, cho thấy mức độ tương thích cao với mã hiện có; phần lớn thư viện và ứng dụng hoạt động mà không cần chỉnh sửa
- Cung cấp quy trình build từ mã nguồn và cài đặt Fil-C trên Debian 13, cùng script cài đặt tự động để biên dịch lại glibc và binutils bằng Fil-C
- Trong khoảng 9000 vi benchmark phần mềm mật mã, Fil-C sử dụng số chu kỳ gấp 1~4 lần so với clang
- Thử nghiệm tích hợp vào hệ thống build gói Debian với Fil-C, thêm ABI mới (
amd64fil0) để cho phép cài đặt song song các gói dựa trên Fil-C
- Fil-C theo đuổi đồng thời an toàn bộ nhớ và khả năng tương thích với hệ sinh thái hiện có, cho thấy khả năng mở rộng sang các hệ thống dựa trên Debian
Tổng quan về Fil-C và ấn tượng ban đầu
- Fil-C là trình biên dịch C/C++ bảo đảm an toàn bộ nhớ, cho thấy mức độ tương thích cao với mã hiện có
- Phần lớn thư viện và ứng dụng hoạt động mà không cần chỉnh sửa
- Một số trường hợp ngoại lệ cần sửa đổi, nhưng không ở mức khó giải quyết
- Tác giả đặt mục tiêu chuyển nhiều hệ thống đang quản lý sang mã được biên dịch bằng Fil-C để tăng cường bảo vệ
- Môi trường thử nghiệm là Debian 13, AMD Ryzen 5 7640HS (6 nhân 12 luồng), RAM 12GB, bộ nhớ swap 36GB
Tài liệu liên quan và script
- Công bố script diff phục vụ kiểm tra để so sánh khác biệt giữa Fil-C và mã nguồn thượng nguồn (ví dụ: clang, glibc)
- Cung cấp script filian-install-compiler để tải về, biên dịch và cài đặt Fil-C, glibc và binutils trên Debian 13
- Tổng thời gian chạy: thời gian thực 86 phút, thời gian người dùng 477 phút, thời gian hệ thống 52 phút
- Cung cấp script filian-install-packages để build các gói nguồn Debian bằng Fil-C
- Một số gói (như bzip2) đã được xác nhận build bình thường
- Công bố biểu đồ hiệu năng Fil-C so với clang
- Kết quả từ khoảng 9000 vi benchmark liên quan đến mật mã
- Mã biên dịch bằng Fil-C tiêu tốn số chu kỳ gấp 1~4 lần so với clang
Cài đặt và build Fil-C
- Sau khi cài các gói cần thiết bằng quyền root, quá trình build được thực hiện bằng người dùng không đặc quyền
filc
- Mã nguồn Fil-C bao gồm glibc cùng nhiều thư viện và ứng dụng cấp cao
- Lệnh build:
time ./build_all_fast_glibc.sh
- Cũng có thể chọn musl, nhưng tồn tại không tương thích với một số gói (attr, elfutils, sed, vim, v.v.)
- Khi gặp thiếu bộ nhớ trong lúc build, vấn đề được giải quyết bằng cách tăng không gian swap lên 36GB
- Tối đa sử dụng khoảng 19GB swap và 12GB RAM
- Trên máy chủ lớn (128 lõi, 512GB RAM), build Fil-C mất 8 phút, build musl mất 6 phút
Build thêm thư viện và ứng dụng
- Fil-C bao gồm build_all_slow.sh để build nhiều thư viện và ứng dụng
- Đã viết script build-parallel-20251023.py để song song hóa quá trình này
- Không dừng toàn bộ quá trình build khi phát sinh lỗi
- Có thể rút ngắn thời gian nhờ build song song
- Trên hệ thống phoenix, 60/61 mục tiêu thành công (thời gian thực 101 phút)
- Chỉ libcap build thất bại (lỗi tải
liblto_plugin.so)
- util-linux cần chỉnh sửa liên quan đến syscall
- Các gói quan trọng còn lại (attr, bash, curl, openssl, vim, v.v.) đều build xong không vấn đề
Các thư viện và ứng dụng đã được kiểm thử thêm
- boost 1.89.0: phần lớn hoạt động bình thường, cần một số chỉnh sửa liên quan đến vfork
- cdb-20251021: hoạt động bình thường, khác biệt ở thông báo lỗi trong bài kiểm thử OOM nhân tạo
- libcpucycles, libgc (thay thế gshim), libntruprime, lpeg, luv v.v. đều build và kiểm thử thành công
- Các ứng dụng CLI quan trọng như mutt, tig, w3m cũng được xác nhận hoạt động bình thường
Tích hợp Debian (Filian)
- Tận dụng cấu trúc đa kiến trúc của Debian để thêm ABI chuyên cho Fil-C (
amd64fil0)
- Ví dụ: có thể cài bản biên dịch bằng Fil-C với
apt install bash:amd64fil0
- Fil-C dùng thư mục riêng thay vì
/usr/include, dẫn tới vấn đề không khớp đường dẫn tệp header
- Script filian-install-compiler điều chỉnh lại điều này theo đường dẫn chuẩn của Debian
- Bổ sung khả năng nhận diện kiến trúc Fil-C vào các công cụ build của Debian (dpdk-buildpackage, sbuild, v.v.)
- Chỉnh sửa các mục như
/usr/share/dpkg/cputable, config.sub v.v.
- Đặt Fil-C và thư viện chuẩn tại đường dẫn
/usr/libexec/fil/amd64
- Có thể dùng các lệnh
filcc, fil++ trên toàn hệ thống
Ví dụ build gói Debian
- Dùng script trợ giúp
fillet để điều chỉnh symbol và đường dẫn cài đặt của gói nguồn Debian
- Kết quả build gói
tinycdb bằng Fil-C tạo ra 3 gói .deb dành riêng cho amd64fil0
- Sau khi cài đặt, dùng lệnh
nm, ldd để kiểm tra symbol Fil-C (pizlonated_) và đường dẫn thư viện
- Khi chạy, xác nhận cơ chế bảo vệ runtime của Fil-C hoạt động (in ra thông báo chặn vi phạm “memory safety”)
Build thêm các gói Debian
- libc-dev: tạo gói giả để giải quyết phụ thuộc
- ncurses: có thể cài đặt sau khi build bằng Fil-C
- libmd: cần biên dịch lại do không khớp phiên bản giữa các kiến trúc
- readline: cần liên kết tượng trưng cho đường dẫn header
- lua5.4: hoạt động bình thường sau khi xử lý phụ thuộc readline
Kết luận
- Fil-C là nỗ lực nhằm đồng thời đạt được tăng cường an toàn bộ nhớ và khả năng tương thích với hệ sinh thái C/C++ hiện có
- Khả năng build và tích hợp gói trong môi trường Debian đã được chứng minh
- Dù cần điều chỉnh một số script build và đường dẫn header, khả năng tương thích với phần lớn các gói nguồn mở quan trọng đã được bảo đảm
1 bình luận
Ý kiến Hacker News
Có lẽ là do độ biến động của microbenchmark, nhưng một số kết quả nhanh đến mức khiến người ta tự hỏi liệu có vấn đề về độ chính xác hay không
Để làm vậy, họ đã tạo và chia sẻ thư viện shim GC cùng các script build
Sau khi tăng swap lên 36GB thì build bình thường, và đã dùng tối đa 19GB swap + 12GB RAM
Trên máy chủ 128 lõi, 512GB RAM, build Fil-C mất 8 phút, còn musl mất 6 phút
Có vẻ Fil-C thực hiện khá nhiều phân tích tĩnh
Có thể xem tại cdb.cr.yp.to, và có nhắc rằng subdomain cdb mới dùng pqconnect
pqconnect được dùng ở bước kết nối HTTP(S), và cả hai đều mã hóa khóa công khai trong DNS nhưng vai trò khác nhau
pqconnect, giống CurveCP, đưa khóa công khai vào CNAME
Tuy nhiên phần pq1 không phải khóa công khai mà là hash của khóa công khai dài hạn của máy chủ
Ghi chú liên quan đến Fil-C được gửi lên cách đây 3 ngày
Chủ đề liên quan
Liên kết thảo luận trước
Mục tiêu dường như là giúp phần lớn chương trình C/C++ có thể chạy an toàn mà không cần viết lại bằng Rust
Cũng tò mò Epic Games liên quan như thế nào
Thay vì viết mã mới, nó phù hợp hơn để bọc an toàn mã hiện có, kiểu như sandboxing WASM
Dù vậy, Fil-C phát hiện crash chính xác hơn
Có lẽ ngay cả chế độ unsafe của Rust cũng có điểm đáng tham khảo từ đây
Đặc biệt, cách liên kết tĩnh các dependency được biên dịch bằng Fil-C khá thú vị
Vì Fil-C phải kiểm soát toàn bộ chương trình để theo dõi con trỏ, nên FFI về mặt cấu trúc là không phù hợp
Ví dụ: Fil-C: A memory-safe C implementation,
Safepoints and Fil-C,
Fil’s Unbelievable Garbage Collector v.v.
Các cuộc thảo luận về an toàn bộ nhớ trong giai đoạn 2024~2025 đang tiếp tục diễn ra
Fil-C là một triển khai an toàn bộ nhớ tương thích với C/C++, và phần lớn mã có thể biên dịch gần như không cần chỉnh sửa
Mọi lỗi bộ nhớ đều được phát hiện dưới dạng panic, và tính an toàn được đảm bảo bằng GC đồng thời và InvisiCaps
Có thể xem giải thích chi tiết hơn tại trang chính thức
build_all_fast_glibc.shyêu cầu tới 31GB bộ nhớTôi muốn biết lý do và cũng muốn tự mình thử Fil-C
Bài viết liên quan