规范中允许状态变化的相关研究
1. 关于 ∼C 关系的问题
在规范方面,除了类 C 中的私有规范外,∼C 关系能保持正确性。公共规范通常不会引用封装状态,但私有规范和其他代码注释可能会引用。例如,即使 f 有 f (x), h → v, k 意味着 h ∼C k 的性质,也不能用相关等式来替换类 C 代码中的断言。
∼C 关系存在问题,它不是一个同余关系。例如,给类 C 添加如下方法:
public int leak() {
return t.Count;
}
虽然由于 f 在类 C 外部观察上是纯的,有 assert f (x) ∼C skip,但 assert f (x); y := leak() ̸∼C skip; y := leak(),这表明在上下文 “−; y := leak()” 中同余性质不成立。
再看上下文 “y := f (x); −”,假设存在 h, h′,除了某个 C 对象 o 使得 h o.t 和 h′ o.t 将 x 映射到不同值外,h ≈ h′。此时 h ∼C h′,但执行 f (x) 得到的结果 v ̸∼C v ′,执行 “y := f (x)” 后的堆 k ̸∼C k ′。显然 skip ∼C skip,但将 skip 放入上下文 “y := f (x); −” 会得到 “y := f (x); skip” 不等于 “y := f (x); skip”,这也是同余关系不成立的反例。
2. 模拟关系
同余关系的第二个反例揭示了根本问题:∼C 关系定义为忽略封装字段和对象,这会使类 C
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



