2 điểm bởi GN⁺ 2025-11-03 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

 
GN⁺ 2025-11-03
Ý kiến Hacker News
  • Nhìn vào benchmark được liên kết, có những trường hợp Fil-C trông còn nhanh hơn C
    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
  • Tác giả có vẻ rất ấn tượng với Fil-C và đang thử tái biên dịch toàn bộ hệ thống Debian bằng Fil-C
    Để làm vậy, họ đã tạo và chia sẻ thư viện shim GC cùng các script build
  • Máy chủ chỉ có 12GB swap nên đã phải khởi động lại nhiều lần vì thiếu bộ nhớ khi biên dịch Fil-C
    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
    • Khả năng cao đó là quá trình build chính LLVM+Clang
  • Điều thú vị là phiên bản cdb 64-bit mới được công bố hỗ trợ cơ sở dữ liệu cỡ exabyte
    Có thể xem tại cdb.cr.yp.to, và có nhắc rằng subdomain cdb mới dùng pqconnect
    • Thực ra cdb.cr.yp.to không có bản ghi NS, nên cấu trúc vận hành là DNSCurve
      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
    • Theo RFC1034, cdb.cr.yp.to có thể được xem là subdomain của cr.yp.to và yp.to
      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ủ
    • Việc dùng pqconnect đã có từ trước, nhưng CNAME của cdb.cr.yp.to có vẻ mới được thêm vào khoảng ngày 21 tháng 10
      Ghi chú liên quan đến Fil-C được gửi lên cách đây 3 ngày
      Chủ đề liên quan
    • Tham khảo thêm, 11 ngày trước cũng đã có thảo luận liên quan
      Liên kết thảo luận trước
  • Tôi nghĩ đây là một dự án rất hay
    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
    • Fil-C là ngôn ngữ dựa trên garbage collection, nên chậm hơn C khá nhiều
      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
  • Tôi rất vui vì công trình của Phil cuối cùng có vẻ đang được công nhận xứng đáng
    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ị
    • Nhưng hiện tại Fil-C không hỗ trợ FFI
      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
  • Có người đã tổng hợp các chủ đề chính liên quan đến Fil-C
    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
  • Tóm tắt dành cho những ai chưa biết Fil-C là gì
    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
    • Để dùng Fil-C, bạn phải chấp nhận Garbage Collector trong runtime
  • Thật đáng ngạc nhiên khi script build_all_fast_glibc.sh yê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
    • Đó là vì quá trình build và liên kết LLVM rất nặng
  • Thật thú vị khi thấy một nhà mật mã học nổi tiếng dùng bash và curl