【发布时间】:2011-02-02 19:05:18
【问题描述】:
这是一个简单的图形操作方法,我用代码契约修饰了它。
确保声明无法证明,但我不明白为什么!我相信它声称在调用 Remove() 之后,边缘不再在边缘列表中,或者结果为假。如果结果为真,它不会声明图的状态。静态检查器不喜欢它,我还没有让 Pex 告诉我如何使用它(尽管我可能只是不知道如何使用它)。
我相信这个例子中的锁是无关紧要的,但我会留下它以防万一。此外, OnRemoveEdge 的委托没有任何保证,但我现在隐含地假设它不会重新进入 Graph 代码。此外,假设在它之后。
public bool Remove(E edge)
{
Contract.Requires(edge != null);
Contract.Ensures(!Contract.Exists(edges, e => e == edge) || !Contract.Result<bool>());
lock (sync)
{
if (!OnBeforeRemoveEdge(edge)) return false;
if (!edges.Remove(edge)) return false;
}
OnRemoveEdge(edge);
Contract.Assume(!Contract.Exists(edges, e => e == edge));
return true;
}
更新:我更改了代码以将事件处理程序 OnRemoveEdge()(但不是委托 OnBeforeRemoveEdge)移出锁定。但是,这对合约与线程相关的假设有什么作用呢?代码契约是否假设为单线程模型?嗯。
【问题讨论】:
-
代码契约目前确实采用单线程模型。
-
edges是一个列表吗?List.Remove没有任何合同。 -
@Porges - 感谢您的回复。 Assume 不能弥补 List 上合约的不足吗?
-
哦,对不起,我错过了。
Exists和ForAll仍然有问题。这可能与我今天早些时候在论坛上发布的内容有关:social.msdn.microsoft.com/Forums/en-NZ/codecontracts/thread/…
标签: c# code-contracts pex formal-verification