级联的设计与实现
1. 级联简介
级联(Cascade)是一款用于检查C程序中断言的工具,旨在作为多阶段验证策略的一部分。它由大约6000行C++代码组成,整体设计如图1所示。级联的核心模块接收一个代表C程序的抽象语法树(AST)和一个控制文件(control file),后者指定了一个或多个需要检查的潜在错误。
2. 核心模块功能
2.1 符号模拟与验证条件构建
核心模块使用符号模拟遍历抽象语法树,构建与控制文件中指定的断言相对应的验证条件。具体来说,C语句的语义被硬编码到核心模块使用的转换规则中,这些规则将C语句转换为逻辑公式。级联采用有界模型检查方法处理循环(和递归函数)。循环被展开固定次数(这个数字可以由用户指定),以确保所有可能的执行路径都被检查。
2.2 内存与指针的精确模拟
级联精确地模拟堆中的所有指针和地址,存储在内存中的数据以整数形式抽象表示。这意味着在符号模拟过程中,级联不仅考虑了程序的控制流,还精确地跟踪了内存状态的变化。这种精确模拟有助于提高验证的准确性,尤其是在处理复杂的指针操作时。
3. 抽象接口设计
为了便于定制和扩展,级联的设计采用了抽象接口。以下是三个主要的抽象接口:
3.1 抽象语法树接口
级联使用抽象语法树(AST)来表示程序的内部结构。所有操作都在这个内部表示上进行,完全分离了前端负责构建抽象语法树的部分。目前,级联使用EDG(E