C# 代码契约失败示例图。删除(边e)

C# 代码契约失败示例图。删除(边e),c#,code-contracts,pex,formal-verification,C#,Code Contracts,Pex,Formal Verification,这里有一个简单的图形操作方法,我用代码契约来修饰它 这个说法无法证明,但我不明白为什么!我相信它声称在调用Remove()之后,要么边缘不再在边缘列表中,要么结果为false。如果结果为真,它对图形的状态没有任何要求。静态检查器不喜欢它,我也没有让Pex告诉我如何使用它(尽管我可能只是不知道如何使用它) 这个锁对于这个例子来说是无关的,我相信,但我会留下它以防万一。此外,OnRemoveEdge的委托没有任何保证,但我现在会隐式地假设它不是图形代码的重入者。此外,假设是在它之后 public b

这里有一个简单的图形操作方法,我用代码契约来修饰它

这个说法无法证明,但我不明白为什么!我相信它声称在调用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;
}
public bool Remove(E边)
{
Contract.Requires(edge!=null);
确保(!Contract.Exists(edges,e=>e==edge)| |!Contract.Result());
锁定(同步)
{
如果(!OnBeforeRemoveEdge(edge))返回false;
如果(!edges.Remove(edge))返回false;
}
OnRemoveEdge(边缘);
假设(!Contract.Exists(edges,e=>e==edge));
返回true;
}
更新:我更改了代码以将事件处理程序OnRemoveEdge()移出锁(而不是委托OnBeforeRemoveEdge)。但是,这对与线程相关的契约假设有什么影响呢?代码契约是否采用单线程模型?嗯。

来自:

声明说,“静态契约检查器尚未处理所有或存在的量词。”


对。正确。

代码契约目前确实采用单线程模型。edges是列表吗<代码>列表。删除没有任何合同。@Porges-感谢您的回复。假设不能弥补清单上合同的不足吗?哦,对不起,我错过了<代码>存在并且所有仍然存在问题。这可能与我今天早些时候在论坛上发布的内容有关: