从具体状态到布尔向量 ​
选择谓词集合
具体状态
抽象状态
有限
对具体状态集合
若谓词本身逻辑相关,例如
抽象转移的存在量词 ​
具体转移关系为
SAT 见证说明至少有一对具体状态实现该边。逐边存在不保证一串抽象边有同一条具体路径,因为中间抽象块可在不同边使用不同具体见证。
这正是 over-approximation:全部具体转移都被覆盖,额外拼接的抽象路径可能形成伪反例。抽象解释提供其可靠性方向。
may transition 用存在量词,适合保守发现可能行为。must transition 则要求抽象块中的每个具体状态都能执行到目标块或满足相应覆盖条件,适合某些必然性质;二者量词不同,不能用同一 SAT 查询实现。
构造整张
计数器关系例子 ​
程序维护
时,抽象能证明非负,却不能证明 (true,true) 同时包含
加入
后,初态落在
有效,因此相等块对循环闭合,可证明 assert x==y。
把谓词换成
若程序使用机器整数,谓词
路径上
Cartesian 与 Boolean 抽象 ​
Cartesian predicate abstraction 为每个谓词独立记录 true、false 或 unknown,成本较低,却不保留谓词间任意布尔关系。Boolean abstraction 可表示谓词真值的任意公式,更精确但可能指数增长。
例如谓词
Boolean abstraction 中,一个抽象状态本身可用布尔公式表示,而不必枚举 valuation。BDD/SAT 可操作这些集合,但公式共享并不消除最坏指数:某些谓词组合仍需巨大表示。
reduced product 可让区间域证明
谓词越多不保证分析单调更快。状态空间按
weakest precondition 接口 ​
对赋值或语句
若都不能确定,抽象转移必须保留两种后态真值。猜一个更常见结果会漏掉具体行为。
对 assume/guard,谓词抽象可以增加条件后重新求一致真值;对 havoc,所有涉及被修改变量且无法由其他谓词推出的真值都要忘记。把 havoc 当保持会得到最危险的欠近似。
函数调用摘要可直接规定谓词关系,但局部形式参数映射到全局实参时要处理 alias;两个实参实际同址,会让分别推导的谓词更新互相影响。
量词消除或 SMT unknown 会限制精度。unknown 通常需保守地当作可能可满足,而不是当作不可达。
边界与应用 ​
谓词抽象特别适合控制性质和少量关键数据关系,不擅长自动表达大规模数值范围。可与区间等域组合,让数值域产生候选谓词或协助可行性检查。
谓词抽象只相对于建模转移 sound。指针别名、溢出、异常或并发干扰若漏编码,有限布尔模型再完整也不能覆盖真实程序。
CEGAR 用伪反例自动补谓词,但循环不保证收敛。若每次只生成路径特定常数,布尔维数持续增长;插值或 unsat core 需要概括导致不可行的共享关系。
安全证明应交付最终谓词集合和抽象不变式,使读者能检查哪些具体状态被覆盖,而不只是报告“模型检查通过”。
参考资料
- Susanne Graf and Hassen Saïdi, “Construction of Abstract State Graphs with PVS,” CAV, 1997, pp. 72–83。
- Thomas Ball et al., “Automatic Predicate Abstraction of C Programs,” PLDI, 2001, pp. 203–213。
- Edmund Clarke et al., “Counterexample-Guided Abstraction Refinement,” CAV, 2000, pp. 154–169。