代码合同失败示例Graph.Remove(Edge e)

时间:2011-02-02 19:05:19

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

这是一个简单的图形操作方法,我用Code Contracts修饰。

确保索赔不会证明,但我不明白为什么!我相信它声称在调用Remove()之后,边缘不再位于边缘列表中,或者结果为false。如果结果为真,它没有声明图的状态。静态检查器不喜欢它,我没有让Pex告诉我怎么样(虽然我可能只是不知道如何使用它)。

对于这个例子,锁是无关紧要的,我相信,但我会留下它以防万一。此外,OnRemoveEdge的委托没有任何保证,但我现在隐含地假设它不能重新进入图形代码。此外,假设是在它之后。

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)移出锁定。但是,这对合同与线程相关的假设有何影响? Code Contracts是否采用单线程模型?嗯。

1 个答案:

答案 0 :(得分:1)

来自Jack Leitch's answer to a similar question

  

Code Contracts User Manual州,“静态合同检查员尚未处理量词人ForAll或Exists。”

真。真。