【问题标题】:Code Contracts failing example Graph.Remove(Edge e)代码合同失败示例 Graph.Remove(Edge e)
【发布时间】: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 上合约的不足吗?
  • 哦,对不起,我错过了。 ExistsForAll 仍然有问题。这可能与我今天早些时候在论坛上发布的内容有关:social.msdn.microsoft.com/Forums/en-NZ/codecontracts/thread/…

标签: c# code-contracts pex formal-verification


【解决方案1】:

来自Jack Leitch's answer to a similar question

Code Contracts User Manual 声明:“静态合约检查器尚未处理量词 ForAll 或 Exists。”

没错。真的。

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2013-03-18
    相关资源
    最近更新 更多