“并发分离逻辑把同一思想扩展为线程资源拆分与共享不变量;分离逻辑自动化则通过 entailment、frame inference 或 bi abduction 推断调用前后未显式写出的剩余堆…”
Symbolic heap 片段 ​
分离逻辑的 symbolic heap 常写作
其中
及 list segment 等归纳谓词构成。
自动化主要解决 satisfiability、entailment
以及在程序命令前后更新 symbolic heap。它不是把普通一阶求解器换一个语法外壳;堆分割和归纳展开是核心搜索结构。
归纳 list segment 可定义为
unfold 一次暴露头单元,fold 则把已证明的头和尾重新封装。定义的 base case 和 ownership 范围若不同,entailment 规则也随之改变。
允许 cyclic heap 时,普通 list predicate 可能不适用;工具若默认 acyclic 但输入没有该前置,会把真实循环结构当不可满足。
指针更新轨迹 ​
前态
表示两个独立单元。执行 x->val := c 后,symbolic execution 消耗
这一步由frame rule局部化。若
如果更新还可能释放或重新分配地址,简单替换 points-to 值不够,需建模 allocation freshness 与 dangling pointer。
执行 free(x) 应消耗 freed 而仍允许普通读写规则,会混淆无所有权与一个可读取哨兵值。
分配 x:=malloc() 产生 fresh 地址及新单元;freshness 是相对于当前 heap domain,不只是与某几个命名指针不等。
entailment 与匹配 ​
要证明
可用 separating conjunction 的交换性规范化。证明 list segment entailment 时,求解器可能 unfold 一个归纳谓词,匹配头节点,再递归处理尾段。
盲目双向展开会造成无限搜索。成熟算法用规则优先级、memoization、cyclic proof 或片段限制保证终止/完备性。
cyclic proof 若回到相似 entailment,必须满足 global progress condition,确保某个归纳结构严格展开;仅因目标文本重复就闭环,会接受
反例模型需要给出具体有限 heap 划分,显示哪个地址重叠或哪个 list link 断裂。求解器返回“not proved”可能是算法不完备/超时,不等于 entailment 为假。
纯部分交给SAT/SMT,但空间匹配产生的地址等式会反向影响纯约束;一次性先解完纯部分再不回看可能漏推论。
Frame inference 与 bi-abduction ​
Frame inference 给定
即从当前资源中分出命令需要的
Bi-abduction 同时寻找 anti-frame
解一般不唯一。取
例如当前有 disposeList(x) 需要
跨多个调用合成契约时,前一调用的 frame 可成为后一调用资源;路径 join 要找到各分支共同可保证的 heap,而不是把互斥分支资源用 separating conjunction 同时要求。
内存错误与失败边界 ​
dereference 要求当前 symbolic heap 能提供相应 points-to;找不到时可能是确切 null/use-after-free 错误,也可能是抽象或函数摘要太弱。报告前需区分不可满足路径与缺失资源。
并发 separation logic 还需权限、资源不变量和原子规则。顺序 symbolic heap 自动化不能直接验证数据竞态。
fractional permission 区分只读共享与独占写:多个线程可持有分数读权限,总和受限;写入通常要求完整权限。若求解器只检查地址不重叠,会错误拒绝合法共享读,或错误允许两个写者。
内存模型中的 weak ordering、原子指令和 reclamation(hazard pointer/epoch)需要专门逻辑;简单 points-to 所有权无法表达“对象已逻辑删除但仍被读者安全访问”的时序协议。
任意归纳谓词 entailment 一般不可判定;工具声称自动化时必须说明支持片段、超时和 unknown。将 unknown 当 valid 会产生不可靠证明。
参考资料
- John C. Reynolds, “Separation Logic: A Logic for Shared Mutable Data Structures,” LICS, 2002, pp. 55–74。
- Cristiano Calcagno et al., “Compositional Shape Analysis by Means of Bi-Abduction,” POPL, 2009, pp. 289–300。
- James Brotherston, Dino Distefano, and Rasmus L. Petersen, “Automated Cyclic Entailment Proofs in Separation Logic,” CADE-23, 2011, pp. 131–146。
- Josh Berdine, Cristiano Calcagno, and Peter W. O’Hearn, “A Decidable Fragment of Separation Logic,” FSTTCS, 2004, pp. 97–109。