コードコントラクト静的チェッカはバインド算術をチェックすることができるはずですか?
-
12-09-2019 - |
質問
(またに投稿MSDNフォーラムに - 。それが、が、私の知る限り、多くのトラフィックを得ることはありません)。
私はAssert
とAssume
の例を提供しようとしてきました。ここで私が持っているコードがあります:
public static int RollDice(Random rng)
{
Contract.Ensures(Contract.Result<int>() >= 2 &&
Contract.Result<int>() <= 12);
if (rng == null)
{
rng = new Random();
}
Contract.Assert(rng != null);
int firstRoll = rng.Next(1, 7);
Contract.Assume(firstRoll >= 1 && firstRoll <= 6);
int secondRoll = rng.Next(1, 7);
Contract.Assume(secondRoll >= 1 && secondRoll <= 6);
return firstRoll + secondRoll;
}
(代わりに、既存のRandom
参照のnull参照を渡すことができることについてのビジネスはもちろん、純粋に教育的である。)
私はチェッカーがfirstRoll
とsecondRoll
が範囲[1, 6]
にそれぞれあったことを知っていたならば、合計が範囲[2, 12]
にあったことをうまくできるようになることを期待していた。
これは不合理な希望ですか?私はそれが起こるかもしれない、まさにワークアウト、トリッキーなビジネスです実現...しかし、私はチェッカーは十分にスマートになります期待していた:)
これは、現在サポートされていない場合、それは近いっぽい将来サポートされる可能性があります場合は、、誰もがここで知っているのですか?
編集:私は今、静的チェッカーでの算術演算のための非常に複雑なオプションがあることを発見しました。 「高度な」テキストボックスを使用すると、私は、Visual Studioからそれらを試してみることができますが、彼らは私の知る限り、何の何のまともな説明がありません。
解決
私は、MSDNフォーラムで答えを持っていました。それは私が非常に近くあったが判明しました。あなたは「と-ED」の契約を分割場合は基本的に静的チェッカは良い作品。そこで、我々はこれにコードを変更する場合:
public static int RollDice(Random rng)
{
Contract.Ensures(Contract.Result<int>() >= 2);
Contract.Ensures(Contract.Result<int>() <= 12);
if (rng == null)
{
rng = new Random();
}
Contract.Assert(rng != null);
int firstRoll = rng.Next(1, 7);
Contract.Assume(firstRoll >= 1);
Contract.Assume(firstRoll <= 6);
int secondRoll = rng.Next(1, 7);
Contract.Assume(secondRoll >= 1);
Contract.Assume(secondRoll <= 6);
return firstRoll + secondRoll;
}
これ何の問題もなく動作します。また、それはチェッカーは、のないの分離契約に良く動作することは非常にポイントを強調としての例では、さらに便利であることを意味します。
他のヒント
私は、MSがチェッカーツールを契約、しかし範囲の分析は、標準的な静的解析技術であることは知りません。それは広く添字式が法定されていることを確認するために、商用の静的解析ツールで使用されます。
MS研究は、静的解析のこの種の良いトラックレコードを持っている、と私は、現在確認されていない場合でも、契約チェッカーの目標であることをこのような範囲の分析を行うことを期待したい。