Contract.Requires()和循环不变的问题

时间:2019-05-08 05:49:09

标签: c#-3.0 code-contracts formal-verification formal-methods loop-invariant

我正在遵循代码合同教程(https://docs.microsoft.com/en-us/dotnet/framework/debug-trace-profile/code-contracts#usage-guidelines),但似乎无法使最简单的东西正常工作。给定方法定义

public int Add(int x, int y)
{
   Contract.Requires(x > 0);
   Contract.Requires(y > 0);

   return x+y;
}

当我调用o.Add(0,0)时,该方法不会失败前提条件检查。在调试模式下,将跳过Contract.Requires()语句。我在哪里做错了?

第二个问题,我可以使用Contract.Invariant()检查循环不变性吗?根据对象不变式Object invariants are conditions that should be true for each instance of a class whenever that object is visible to a client.的定义,该定义似乎与循环不变式有些不同,因为在每次循环迭代中,循环不变式可能不一定对客户端可见,因此它可能会违反属性但不会得到检查。这种理解正确吗?

1 个答案:

答案 0 :(得分:0)

要回答第一个问题,请从here下载并运行Code Contracts .msi文件。 .msi文件包括静态检查器和二进制重写器(用于运行时检查),它们通过注入使合同作为程序执行的一部分进行检查的合同来修改程序。没有重写者,将不会检查合同。请注意,重写器仅适用于Visual Studio 2013和2015。

为回答第二个问题,您不能使用Contract.Invariant()来检查循环不变式。我建议在循环中使用Contract.Assume()