Fil-C: 实现 C 程序的内存安全

Fil-C: 实现 C 程序的内存安全

Fil-C 是一种旨在消除常见内存相关漏洞的 C 编程语言的内存安全实现。与通过编译时静态分析强制执行安全的语言不同,Fil-C 专注于在执行过程中验证内存访问,以防止崩溃和安全漏洞。

运行时内存安全强制执行

Fil-C 在运行时动态强制执行内存安全,而不是在编译时。这意味着虽然带有内存错误的程序可能仍能成功编译,但系统会在尝试进行无效内存访问的瞬间检测并报错。

这种架构选择使 Fil-C 与诸如 Rust 之类的语言区分开来,Rust 使用借用检查器在编译阶段拒绝大类内存安全错误。虽然 Rust 也会执行一些运行时检查(如边界检查和 RefCell 验证),但 Fil-C 的主要安全机制是运行时验证内存操作。

系统调用和 Fil-C 标准库

Fil-C 使用自定义的 libc 实现来管理系统调用。该项目声称系统调用是安全的,因为它们由此自定义库中介。然而,批评者指出,这个自定义 libc 最终会调用系统底层的 libc,实际的系统调用在那里执行。

这导致了与 Rust 在系统调用方面的方法进行比较。在 Rust 中进行原始系统调用被视为 unsafe,而使用 Rust 标准库提供了一种安全的抽象层,类似于 Fil-C 程序使用 Fil-C 标准库来维持安全边界的方式。

技术扩展和生态系统

Fil-C 已将其能力扩展到基本内存安全之外,以包含专门的系统级功能:

  • 内联汇编清理: Fil-C 包含一个用于内联汇编的清理器,一些开发者认为这可能作为独立工具具有价值。
  • 优化的调用约定: 项目引入了优化的调用约定以提高性能。
  • 内存安全的上下文切换: Fil-C 提供了在并发环境中进行安全上下文切换的机制。
  • 库移植: 包含 freetypefontconfigharfbuzzgraphite 在内的几个基础库已经移植到 Fil-C。

与其他安全模型的比较

Fil-C 常被视为在 C 语言背景下的内存安全工具,但它可以被视为一种互补工具,而不是 Rust 的直接竞争者。由于它提供了运行时安全层,因此可能被用于编译其他语言或与现有的基于 C 的基础设施集成,在这些地方静态安全保证不可行。

一些观察者将 Fil-C 的方法与基于硬件的解决方案(如 Apple 的 Memory Integrity Enforcement)进行比较,指出 Fil-C 的基于软件的方法不依赖特定的硬件要求来提供其安全保证。

Sources