我有这个代码:
using System;
using System.Diagnostics.Contracts;
namespace TestCodeContracts
{
class Program
{
public static int Divide(int numerator, int denominator, out int remainder)
{
Contract.Requires<ArgumentException>(denominator != 0);
Contract.Requires<ArgumentException>(numerator != int.MinValue || denominator != -1, "Overflow");
Contract.Ensures(Contract.Result<int>() == numerator / denominator);
Contract.Ensures(Contract.ValueAtReturn<int>(out remainder) == numerator % denominator);
remainder = numerator % denominator;
return numerator / denominator;
}
static void Main(string[] args)
{
int remainder;
Console.WriteLine(Divide(10, 6, out remainder));
Console.WriteLine(Divide(5, remainder, out remainder));
Console.WriteLine(Divide(3, 0, out remainder));
Console.Read();
}
}
}
在第一次 Divide 调用中,如果我替换6
为0
,则静态分析会正确警告它。
如果我替换6
为5
,那么我(正确地)在第二次 Divide 调用时收到警告。
但是,无论如何,我在第三次 Divide 电话中从未收到任何警告。相反,我只是得到一个运行时错误。
为什么静态分析器无法检测到第三行是否违反合同?
我在 Windows 8 64 位上使用 Visual Studio 2012。代码合同是Microsoft Code Contracts (devlabs_TS) 1.4.51019.0 for .NET
(这似乎是截至 2012 年 12 月的最新版本)。