通过三C工具将C语言项目迁移至checked C

由于C/C++语言的持续使用,空间安全违规(如缓冲区溢出)仍然是当今最危险且普遍存在的安全漏洞之一。为应对这一问题,Checked C通过引入边界强制检查的指针类型扩展了C语言。Checked C本质上是一种渐进类型化的空间安全C语言变体,其检查指针与传统指针保持二进制兼容,并支持逐步添加而非一次性全面改造,从而实现渐进式的安全升级。

本文提出了一种将传统C程序移植到Checked C的半自动化流程,其核心是基于静态分析的3C注释工具。3C采用两种创新算法——typ3c(类型分析)和boun3c(边界推断),能够将传统指针标注为检查指针,并为需要边界检查的指针推断数组边界注释。3C会执行根本原因分析来指导开发者进行必要的代码重构,完成重构后可重新运行3C以推断更多注释(并更新根本原因)。在11个总计319KLoC的程序测试中,3C展现出优秀的检查指针类型推断能力,实际移植经验表明其与人工重构配合良好。

CCS概念

软件工程:翻译器编写系统与编译器生成器;软件维护工具

安全与隐私:形式化安全模型

关键词:Checked C,空间安全防护,源代码重写

尽管已有大量研究成果,内存破坏导致的漏洞仍是C程序面临的重大问题。微软2019年BlueHat分析显示,空间内存安全问题(如缓冲区溢出等无效内存访问)是最常见的漏洞类别;MITRE 2021年CWE Top-25榜单中,越界读写分别位列前三。

现有工具(如CCured、Softbound、Low Fat指针和Address Sanitizer等)通过运行时安全检查自动实施空间安全,但存在两大局限:60%-200%的性能开销过高,以及对某些编程习惯用法的支持不足导致程序被拒绝或部分保护缺失。虽然理论上可将C转换为Rust等内存安全语言,但由于语言差异过大,目前最佳转换工具c2rust产生的仍是非惯用、不安全的Rust代码。

Tarditi等人提出的Checked C为传统/活跃C代码提供了实用转换目标。Checked C通过三种检查指针类型(ptr<T>、array_ptr<T>和nt_array_ptr<T>)扩展C语言,编译器会限制这些指针的空间安全使用。其中数组指针需附带边界注释(如array_ptr<int> p : count(n))。

Checked C的Clang/LLVM编译器将检查指针表示为系统级内存字(无"膨胀"元数据),确保二进制兼容性,并基于边界注释插入动态检查。LLVM常能证明这些检查冗余并予以消除,因此性能优异——基准测试平均开销仅8.6%,FreeBSD内核转换部分甚至基本无开销。

全国开展老年人药品保健品虚假宣传整治工作