私はこのコードを持っています:
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
、(正しく) 2 回目の Divide 呼び出しで警告が表示されます。
ただし、何があっても、3 回目の Divide 呼び出しで警告が表示されることはありません。代わりに、実行時エラーが発生します。
静的アナライザーが 3 行目が契約違反であることを検出できないのはなぜですか?
Windows 8 64 ビットで Visual Studio 2012 を使用しています。コード コントラクトはMicrosoft Code Contracts (devlabs_TS) 1.4.51019.0 for .NET
(2012 年 12 月現在の最新バージョンのようです) です。