CIL:用于分析和转换的中间语言及工具
StackGuard的改进实现
传统的StackGuard存在猜测金丝雀值的风险,并且即使对于没有局部数组变量的函数也会产生开销。改进后的StackGuard实现步骤如下:
1. 当函数被调用时(第28行),将当前返回地址压入私有栈。
2. 在函数返回之前(第15行),从私有栈中弹出之前保存的返回地址。
这里假设存在两个外部函数 get and push ra
和 restore ra
来完成上述操作。并且,只有包含局部数组变量的函数才会被修改(第3 - 9行代码实现检查)。由于所有CIL函数都有显式返回(在第14行检查),这使得该转换过程得到简化。代码会使用CIL库例程(如访问器)。应用此转换后,只需在链接时提供保存和恢复返回地址的函数实现即可。如果在抽象语法树(AST)上执行此转换,会复杂得多,因为需要先进行一些CIL已经完成的详细处理。
确保C程序的内存安全
CCured是一个结合类型推断和运行时检查的系统,旨在使现有的C程序具备内存安全性。其工作流程如下:
1. 全程序分析 :对程序中类型的结构和使用进行全程序分析。
2. 类型和访问修改 :根据分析结果,修改程序中的类型定义和内存访问。
3. 运行时检查插入 :当无法静态验证内存引用的安全性时,插入适当的运行时检查。
分析过程涉及遍历程序中的所有类型,并使用一种结构相等性的形式来比较涉及类型转换的类型。CIL更简单的类型语言(递