.Net 코드 계약 (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