文章摘要
Fil-C是一个内存安全的C/C++实现方案。文章介绍了其简化模型,通过自动重写源代码将不安全指针操作转换为安全版本,为每个指针变量添加对应的AllocationRecord结构来跟踪内存分配情况,从而确保内存安全。这有助于理解完整Fil-C实现的工作原理。
文章总结
Fil-C简化模型解析:内存安全的C/C++实现
核心概念
Fil-C是一种内存安全的C/C++实现方案,其核心机制是通过代码转换和运行时检查来确保指针操作的安全性。简化模型通过自动化重写源代码实现,而实际生产版本则通过重写LLVM IR实现。
关键技术
指针变量改造
- 每个指针变量
p会伴随一个AllocationRecord* par变量 - 示例转换:
c // 原始代码 void f() { T* p; } // 转换后 void f() { T* p; AllocationRecord* par = NULL; }
- 每个指针变量
内存分配机制
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}; }
指针操作安全验证
- 解引用时进行边界检查:
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;
- 解引用时进行边界检查:
指针传播机制
- 堆中指针通过"隐藏内存"(invisible_bytes)存储元数据
- 指针赋值时会同步元数据:
c // 原始代码 p2 = *p1; // 转换后 p2 = *p1; p2ar = *(AllocationRecord**)(p1ar->invisible_bytes + i);
内存管理
垃圾回收机制
- 采用标记-清除式GC(生产版本使用并行增量GC)
- 自动回收未引用的
AllocationRecord - 特殊处理:长度为0的分配记录会被重定向到规范记录
释放函数
c void filc_free(void* p, AllocationRecord* par) { if (p) { free(par->visible_bytes); free(par->invisible_bytes); // 注:AllocationRecord对象由GC回收 } }
特殊处理
局部变量地址逃逸
- 当取地址操作可能逃逸作用域时,自动转为堆分配
memmove实现
- 对齐的批量移动会同步处理隐藏内存
- 单字节移动则保持可见内存不变
生产级增强
- 线程安全
- 需要处理原子操作和并发回收
- 函数指针
- 通过额外元数据验证类型签名
- 性能优化
- 延迟分配隐藏内存
- 合并内存分配
适用场景
- 需要验证现有C/C++代码内存安全性的场景
- 作为类似AddressSanitier的内存调试工具
- 安全编译时评估(如Zig语言)
- 指针来源(provenance)研究的参考实现
(注:原文中关于指针来源理论的讨论和技术细节示例已精简,保留了核心机制说明)
评论总结
总结评论内容:
支持Fil-C项目的观点:
- 认为Fil-C是被低估的项目,能够实现C程序的内存安全编译
- "Fil-C is one of the most underrated projects...compile your C program completely memory safe"
对Fat指针技术的质疑:
- 指出这是多次被拒绝的"fat pointers"技术变种,存在安全性不足、跨ABI边界困难或性能开销问题
- "yet another variant of the 'fat pointers' technique...rejected many times due to...insufficient security guarantees"
实用工具分享:
- 提供了将Fil-C与Bazel结合使用的模板,支持封闭构建
- "bazel target for people who may want to use these two together to make hermetic builds"
注:所有评论均未显示评分(None),因此无法评估认可度。