Skip to content

模型Model

分离逻辑

施工中 · 内容逐步修订

Separation logic

以分离合取表达互不重叠资源并局部推理堆内存的程序逻辑。

形式陈述 ​

分离逻辑把程序状态中的堆视为有限部分映射,并加入分离合取 P∗Q。对堆 h,

h⊨P∗Q

当且仅当存在定义域不交的 h1,h2,使 h=h1⊎h2、h1⊨P 且 h2⊨Q。断言 ℓ↦v 表示当前堆恰含位置 ℓ 映射到 v 的单元,emp 表示空堆。分离蕴含(magic wand)P−∗Q 描述加入任意满足 P 的不相交堆后得到 Q。

本页的 Hoare 三元组采用安全性与部分正确性:从每个满足 P 的栈—堆状态出发,C 的任何执行都不得到达内存错误状态 fault,且每个正常终止状态都满足 Q。这里也量化分配等操作的所有非确定选择;允许发散,不额外要求终止。经典框架规则为

{P} C {Q}{P∗R} C {Q∗R},Mod(C)∩FV(R)=∅,

侧条件保证 C 不会修改被框住断言 R 依赖的栈变量;堆资源的不相交由 ∗ 负责。这两个条件不能互相替代。规则还依赖命令语义的局部性:在已满足局部前置条件的堆上安全运行时,加入不相交堆不会让命令额外破坏它。对于能够观察整个堆大小等非局部原语,不能仅靠上述变量条件就宣称框架规则成立。

更一般的分离逻辑不必把资源限于堆的不交并:它可建立在 partial commutative monoid 或 separation algebra 上。在精确 heap semantics 中,ℓ↦v 通常表示恰好一个单元堆;在 intuitionistic、upward-closed 变体中,同一符号可能表示至少拥有该单元。权限、ghost state 与并发 invariant 是并发分离逻辑添加的结构,不是经典堆分割语义自动提供的。

直觉

普通逻辑的 P∧Q 只说两件事同时成立,可能都谈论同一个内存单元;P∗Q 额外承诺它们拥有的堆片段互不重叠。这个所有权分割让函数规格只描述自己会触及的“小脚印”,调用者的其余堆可自动框住。别名不再靠全局猜测,而由能否把堆拆成不交部分显式控制。类比物理资源很有用,但现代分离逻辑也能用分数权限等方式表达共享,不必把所有权理解成永远独占。

分离逻辑示意图
例子与边界

断言 (x↦1)∗(y↦2) 表示 x,y 是不同位置,堆可拆为两个单元。命令 [x]:=[x]+1 可由局部规格

{x↦n} [x]:=[x]+1 {x↦n+1}

验证;若另有 y↦m,应用框架规则可在前后条件中同时保留它。

要隔离“值矛盾”和“资源重叠”,更好的对照是 (x↦1)∧(x↦1) 与 (x↦1)∗(x↦1)。前者在单元堆上成立,后者即使两边值相同也不可满足,因为同一地址不能分给两个不交子堆。原来的 (x↦1)∗(x↦2) 当然也不可满足。

变量侧条件有独立作用:若 R 为 y↦2,命令只是把栈变量 y 改成另一个地址,即使没有写入原来的堆单元,R 也未必仍成立。反之,链表断言 (x↦y)∗(y↦0) 可以满足:第一个单元的值指向第二个单元,但两个被拥有的地址仍不同。“数据有引用关系”不等于“堆域重叠”。

推论与应用

分离逻辑扩展可变状态语义与Hoare 三元组,框架规则是其局部性原则的集中表达。递归谓词可描述链表、树和图的堆布局。

它广泛用于内存安全、指针程序、并发算法与程序验证工具;分离逻辑自动化把 symbolic heap entailment、frame inference 与 bi-abduction 组织成可执行过程,尝试补出缺失的前置资源或调用后剩余的堆。逻辑给出资源语义和可靠规则,自动化只负责在受支持片段内搜索证明,不能把工具可解片段当成分离逻辑的全部表达力。

并发分离逻辑以资源不变量和权限控制线程间共享,支撑对数据竞争自由和线性化点的模块化证明。这里的“所有权”是断言对资源份额的语义解释;语言所有权系统则以 move、loan 与生命周期静态限制程序,两者可以互相验证,却不是同一套规则或术语替换。

参考资料
  • William Mansky, Automating Separation Logic for Concurrent C Minor, Princeton University, 2008,堆分离与框架规则。

  • John C. Reynolds, An Overview of Separation Logic,§4 明确给出不出错且正常终止时满足后置条件的三元组语义。

  • John C. Reynolds, Separation Logic: A Logic for Shared Mutable Data Structures, LICS 2002,pp. 55–74。

  • Peter W. O'Hearn, Separation Logic, Communications of the ACM 62(2), 2019,pp. 86–95。

关系图谱20 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系