发布 Fil-C Linux/x86_64 版本 0.679 · pizlonator/fil-c

Lobsters Hottest 工具

摘要

Fil-C 0.679 是一个全新版本,它是 C 和 C++ 的一种极度兼容的内存安全实现,采用并发垃圾回收和隐形能力来防止所有内存安全错误,且没有逃生舱口。

<p><a href="https://lobste.rs/s/q3gqcs/release_fil_c_linux_x86_64_version_0_679">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/06/08 13:18

pizlonator/fil-c 源代码:https://github.com/pizlonator/fil-c # Fil-C 0.679

Fil-C 是一个对兼容性极度狂热的 C 和 C++ 内存安全实现。大量软件只需零改动或极少量改动即可在 Fil-C 下编译运行。所有内存安全错误都会导致 Fil-C 触发 Panic。Fil-C 通过结合使用并发垃圾回收和不可见能力(内存中每个指针对应一个能力,但对 C 地址空间不可见)来实现这一目标。每个基本的 C 操作(在 LLVM IR 中体现)都会对照能力进行检查。Fil-C 没有 unsafe 语句,且只提供有限的 FFI 去调用不安全代码。

Fil-C 的特殊之处在于:

  • Fil-C 实现了完全安全,没有逃生舱。Fil-C 中没有可以关闭保护的 unsafe 关键字。链接到不安全代码受到严格限制。
  • Fil-C 基于能力的方法实现了与硬件能力(如 CHERI,https://www.cl.cam.ac.uk/research/security/ctsrd/cheri/)类似的安全水平,而且它运行在普通硬件上(目前是 X86_64)。
  • Fil-C 的设计宗旨是防止内存安全漏洞被用于利用,而不仅仅是经常标记它们以便于发现 bug。这使 Fil-C 与 AddressSanitizer(https://github.com/google/sanitizers/wiki/addresssanitizer)、HWAsan 或 MTE(https://developer.arm.com/documentation/108035/0100/Introduction-to-the-Memory-Tagging-Extension)不同,后者都能被攻击者绕过。实现这一点的关键区别在于,Fil-C 是基于能力的(每个指针知道它可以访问哪个内存范围以及如何访问),而不是基于标签的(只要命中有效内存,指针访问就允许)。
  • 从语言用户的角度来看,Fil-C 就是带有 GCC/clang 扩展的 C 和 C++。你最喜欢的 C 或 C++ 程序或库极有可能在 Fil-C 下零改动编译通过。Fil-C 编译器基于 clang 20.1.8,因此支持 C17 和 C++20。

许可证

编译器(clang + LLVM)受 LLVM-LICENSE.txt 保护。运行时受 PAS-LICENSE.txt 保护(见源代码分发包中的 libpas/LICENSE.txt)。在经典的基于 musl 的 Fil-C 分发包中,musl libc 受 MUSL-LICENSE.txt 保护(见源代码分发包中的 projects/yolomusl/COPYRIGHT 和 projects/usermusl/COPYRIGHT)。在 /opt/fil 分发包中,glibc 受 glibc-LICENSE.txt 保护,所有其他包含的程序受相应的 -LICENSE.txt 文件保护。C++ 库(libc++/libc++abi)受 LLVM-LICENSE.txt 保护。

你可以从 GitHub(https://github.com/pizlonator/fil-c)获取编译器、运行时、libc++/libc++abi、libc(musl 和 glibc)以及所有包含程序的源代码。源代码分发包还在 projects/ 和 pizlix/ 目录中包含了大量已移植到 Fil-C 的附加程序,这些程序具有不同的许可证。/opt/fil 分发包包含了各种附加程序的构建,其许可证位于该分发包的 additional-licenses/ 中。

系统要求

Fil-C 仅适用于 Linux/X86_64。之前的版本也适用于 Darwin/ARM64 和 FreeBSD,但现在我只专注于 Linux/X86_64,因为这能让我更忠实地实现 libc。没有任何根本性障碍阻止 Fil-C 在 ARM 或 Linux 以外的操作系统上运行。

快速开始

如果你下载了 Fil-C 二进制文件,请运行:

./setup.sh

根据你选择的二进制分发包,其效果不同:

  • 如果是经典的基于 musl 的分发包(filc-0.679-linux-x86_64.tar.xz),它将 Fil-C 设置在当前目录中运行。
  • 如果是基于 glibc 的 /opt/fil 分发包(optfil-0.679-linux-x86_64.tar.xz),它将 Fil-C 设置在 /opt/fil 下。

如果你下载了 Fil-C 源代码,请运行:

./build_all_fast.sh

然后你就可以在此目录中使用 Fil-C 了。

Fil-C 的二进制分发包附带 musl 作为 libc。在源代码分发包中使用 ./build_all_fast.sh 也会使用 musl 构建 Fil-C。如果你使用源代码,你还可以:

  • ./build_all_fast_glibc.sh — 构建类似的设置,但使用 glibc 2.40 作为 libc。
  • ./build_all.sh — 完整的基于 musl 的构建(也会构建大量已移植到 Fil-C 的软件)。
  • ./build_all_glibc.sh — 完整的基于 glibc 的构建(会构建更多已移植到 Fil-C 的软件)。
  • cd pizlix && sudo ./build.sh — 构建 Pizlix(https://fil-c.org/pizlix)Linux 发行版。
  • cd optfil && sudo ./build.sh — 构建 /opt/fil 分发包。

可运行的程序

大量软件包在 Fil-C 下零改动或很少改动即可运行,包括诸如 openssl、CPython、SQLite 等大型软件包(https://fil-c.org/programs_that_work)。Fil-C 足够强大,能够支持一个完全内存安全的 Linux 用户空间(https://fil-c.org/pizlix)。Fil-C 完全支持 C 和 C++,以及 clang 20 支持的大部分扩展。例如,它对原子操作和 SIMD 内建函数有出色的支持。

Fil-C 能捕获所有使 C 语言内存安全变得困难的问题,例如:

  • 堆或栈上的越界访问。
  • 释放后使用(堆或栈)。
  • 指针与非指针之间的类型混淆。
  • 链接导致的类型错误。
  • 误用 va_list 导致的类型错误。
  • 指针竞争条件。
  • 系统调用。所有传递给系统调用的缓冲区都会检查边界和类型。
  • 许多其他问题。

Fil-C 附带一个相当完整的 POSIX libc,甚至支持诸如线程、信号处理、mmap/munmap、longjmp/setjmp 和 C++ 异常等复杂特性。

了解更多

你可以通过访问网站(https://fil-c.org/)了解关于 Fil-C 的更多信息。你也可以给我发邮件:[email protected]。在 Twitter(https://x.com/filpizlo)上关注我。在 GitHub(https://github.com/pizlonator/fil-c/issues)上提交问题。

相似文章

Filian,Debian 上的 Fil-C 二进制文件

Lobsters Hottest

讨论了 Filian、Fil-C 工具链以及在 Debian 上构建 Fil-C 二进制文件,标志着主流 Linux 发行版在采用内存安全 C 语言方面取得了进展。

Fil-C: Garbage In, Memory Safety Out

Lobsters Hottest

Fil-C 是一个完全内存安全的 C/C++ 实现,通过 LLVM IR 阶段的不可见能力(invisicaps)将指针值与边界信息捆绑,实现高兼容性,性能损失约 4 倍。

I want extern "fil-c"

Lobsters Hottest

作者主张一种讲 Fil-C ABI 的 Rust FFI,使其能够与重新编译的 C/C++ 库安全互操作,并呼吁 Rust、Fil-C、Zig 和 Nix/filnix 社区之间进行跨生态协作。

Fil-C 优化调用约定

Hacker News Top

Fil-C 优化调用约定确保 C 程序即使在恶意滥用情况下也能保持内存安全性,同时通过在常见情况下省略安全检查来保持效率。它解释了通过 panic 或定义明确的行为来处理类型违规的通用优化和寄存器传递优化。