Hacker News 中文摘要

RSS订阅

Fil-C简化模型 -- A simplified model of Fil-C

文章摘要

Fil-C是一个内存安全的C/C++实现方案。文章介绍了其简化模型,通过自动重写源代码将不安全指针操作转换为安全版本,为每个指针变量添加对应的AllocationRecord结构来跟踪内存分配情况,从而确保内存安全。这有助于理解完整Fil-C实现的工作原理。

文章总结

Fil-C简化模型解析:内存安全的C/C++实现

核心概念

Fil-C是一种内存安全的C/C++实现方案,其核心机制是通过代码转换和运行时检查来确保指针操作的安全性。简化模型通过自动化重写源代码实现,而实际生产版本则通过重写LLVM IR实现。

关键技术

  1. 指针变量改造

    • 每个指针变量p会伴随一个AllocationRecord* par变量
    • 示例转换: c // 原始代码 void f() { T* p; } // 转换后 void f() { T* p; AllocationRecord* par = NULL; }
  2. 内存分配机制

    • filc_malloc实际执行三次分配: c void* filc_malloc(size_t length) { AllocationRecord* ar = malloc(sizeof(AllocationRecord)); ar->visible_bytes = malloc(length); // 可见内存 ar->invisible_bytes = calloc(length,1);// 隐藏内存(记录指针元数据) ar->length = length; return {ar->visible_bytes, ar}; }
  3. 指针操作安全验证

    • 解引用时进行边界检查: c // 原始代码 x = *p; // 转换后 assert(par != NULL); uint64_t i = (char*)p - par->visible_bytes; assert(i < par->length); assert((par->length - i) >= sizeof(*p)); x = *p;
  4. 指针传播机制

    • 堆中指针通过"隐藏内存"(invisible_bytes)存储元数据
    • 指针赋值时会同步元数据: c // 原始代码 p2 = *p1; // 转换后 p2 = *p1; p2ar = *(AllocationRecord**)(p1ar->invisible_bytes + i);

内存管理

  1. 垃圾回收机制

    • 采用标记-清除式GC(生产版本使用并行增量GC)
    • 自动回收未引用的AllocationRecord
    • 特殊处理:长度为0的分配记录会被重定向到规范记录
  2. 释放函数 c void filc_free(void* p, AllocationRecord* par) { if (p) { free(par->visible_bytes); free(par->invisible_bytes); // 注:AllocationRecord对象由GC回收 } }

特殊处理

  1. 局部变量地址逃逸

    • 当取地址操作可能逃逸作用域时,自动转为堆分配
  2. memmove实现

    • 对齐的批量移动会同步处理隐藏内存
    • 单字节移动则保持可见内存不变

生产级增强

  1. 线程安全
    • 需要处理原子操作和并发回收
  2. 函数指针
    • 通过额外元数据验证类型签名
  3. 性能优化
    • 延迟分配隐藏内存
    • 合并内存分配

适用场景

  1. 需要验证现有C/C++代码内存安全性的场景
  2. 作为类似AddressSanitier的内存调试工具
  3. 安全编译时评估(如Zig语言)
  4. 指针来源(provenance)研究的参考实现

(注:原文中关于指针来源理论的讨论和技术细节示例已精简,保留了核心机制说明)

评论总结

总结评论内容:

  1. 支持Fil-C项目的观点:

    • 认为Fil-C是被低估的项目,能够实现C程序的内存安全编译
    • "Fil-C is one of the most underrated projects...compile your C program completely memory safe"
  2. 对Fat指针技术的质疑:

    • 指出这是多次被拒绝的"fat pointers"技术变种,存在安全性不足、跨ABI边界困难或性能开销问题
    • "yet another variant of the 'fat pointers' technique...rejected many times due to...insufficient security guarantees"
  3. 实用工具分享:

    • 提供了将Fil-C与Bazel结合使用的模板,支持封闭构建
    • "bazel target for people who may want to use these two together to make hermetic builds"

注:所有评论均未显示评分(None),因此无法评估认可度。