スタティックチェッカーが何を証明できないかを知るために、.Net Code Contracts(VS2010 Ultimate .Net 4)を使い始めました。コード契約では、ループの検証が保証されていません
私は、次の例にしようとしている: -
public int Mult(int num1, int num2)
{
Contract.Requires(num2 >= 0);
Contract.Ensures(Contract.Result<int>() == (num1 * num2));
int result = 0;
for (int i = 0; i < num2; i++)
{
result = result + num1;
}
return result;
}
すなわち、乗算機能の簡単な実装を、繰り返し加えることで。 ..
CodeContracts: ensures unproven: Contract.Result<int>() == (num1 * num2)
私の機能は、実際に製品を正しく計算されていないか、または静的チェッカーは確認できない別の理由があります - は:
静的チェッカは事後条件が満たされていることを確認することはできません必要ですか?ループが存在すると難しいですか?
ループが存在するときに静的チェッカーが物事を確認することが困難な場合は、常に多くの警告を発するのは非常に面倒です。
最初にバグの原因となっている一般的に私の間違った仮定であるため、私は何が起こっていると思うかを推測するためにAssumesを入れるオプションが嫌いです!
静的チェッカーで何かを証明できない場合、どうすればそれを手伝うことができますか? たとえば、関数を再帰関数として書き直すことができます。チェッカーは、それをより簡単に検証できるでしょうか? (関数型プログラミングの主張者は、これが最初の場所に書かれているべきだと言っているかもしれない。静的チェッカーを簡単にするために他のどのような方法でコードを変更できますか?
感謝!:)
ここには関連性のある情報があります:http://blogs.msdn.com/b/ericlippert/archive/tags/reachability/ –
@Jeffrey、偶然、あなたと同じブログ記事にリンクしてしまいました。面白い! :) – stakx