1(c)第8-9行所示:将recordptr
参数改为泛型受检类型(使用全称量化_For_any
保证安全性)。重新运行3C后得到完全转换的1(c)。
第二阶段:
当第一阶段无法完成全部迁移时,此时存在两个代码版本:
(a) 原始版本:已通过多次重构,可能包含少量Checked C注解
(b) 3C生成的注解版本
本阶段需手动完成(b)版本文件的迁移,将其合并至(a)版本并测试。3C利用互操作类型(itype)简化该过程:第二阶段开始时直接复用itype注解的头文件,确保其兼容注解/非注解代码。有时对合并后的文件再次运行3C可传播手动修改。
迁移过程中可能发现空间安全性缺陷:
编译器拒绝原以为合法的边界声明
测试运行时触发边界检查失败
(如第6.6节所述,我们在迁移tiny-bignum和thttpd时曾以此方式发现内存安全漏洞)
程序员可在第二阶段随时中止迁移,仍能获得可运行、已测试且安全性提升的代码版本。
3C首先通过全程序分析工具typ3c将传统指针转换为受检指针,其包含两部分: