2012-12-08 4 views
2

를 감지하지 않습니다.코드 계약 정적 분석기는이 코드가 사소한 계약 위반

65으로 바꾸면 두 번째 Divide 통화에서 경고 메시지가 나옵니다.

그러나 무엇이든지간에 never 세 번째 Divide 통화에 대한 경고가 표시됩니다. 대신, 난 그냥 런타임 오류가 발생합니다.

정적 분석기가 세 번째 줄이 계약 위반이라는 것을 감지하지 못하는 이유는 무엇입니까?

Windows 8 64 비트에서 Visual Studio 2012를 사용하고 있습니다. 코드 계약은 Microsoft Code Contracts (devlabs_TS) 1.4.51019.0 for .NET (2012 년 12 월 현재 최신 버전 인 것 같습니다)입니다.

+0

매우 자세히 확인 했습니까? 그 사이에 재건축이 있니? '(6에서 0으로 변경하는 방식 대신) 더 많은 테스트 호출을 설정하는 것이 더 좋습니다. –

+0

@HenkHolterman 재건축해도 결과가 바뀌지 않습니다. 또한 세 가지 테스트 함수 ('Test1','Test2' 및'Test3')에서 세 번째 사례 (첫 번째 Divide 호출에 대해 '6', '5'및 '0')를 격리 한 다음 세 가지 테스트 함수를 사용하는 경우, 두 가지 테스트 함수 중 두 가지에서만 경고가 표시됩니다. 각 테스트 함수의 세 번째 분할 호출은 분명히 계약 위반 임에도 불구하고 경고를 얻지 못합니다. – luiscubal

답변

3

게시했습니다. this in the code contracts forum입니다. 이것이 실제로 버그이며 그것이 고쳐질 것이라는 것이 확인되었습니다.

버그는 정적 검증이 분할 (3, 0 ...)

(...)

우리는 버그가 해결됩니다 도달 할 수없는 생각이다.

1

이것은 흥미로운 문제입니다.

나는 마침내 아래로 Divide을 단순화 : 심지어 하나 개의 프로젝트, 당신은 일반적으로 재 구축보다는 구축해야 발견

static void Main(string[] args) 
{ 
    Console.WriteLine(Divide(10, 10)); 
    Console.WriteLine(Divide(10, 0)); 
} 

참고 :

public static int Divide(int numerator, int denominator) 
{ 
    Contract.Requires<ArgumentException>(denominator != 0); 
    return numerator/denominator; 
} 

이 올바른 경고를 던졌습니다 . 다시 빌드 할 때 코드 정리 아티팩트가 정리되어야합니다.

이 경고를 포기하지 않는다 : 첫 번째 분할의 분모가 10 살 (그리고 0 때 그것은 분명히 또한 일) 만약 내가 경고를 게재 할 수

static void Main(string[] args) 
{ 
    Console.WriteLine(Divide(10, 9)); 
    Console.WriteLine(Divide(10, 0)); 
} 

수있는 유일한 방법이었다.

버그가있는 것처럼 보입니다. 코드 계약 팀에게 이메일을 보내고 그들이 말하는 것을 보았습니다.

+0

"빌드보다는 다시 빌드해야 함"이란 무엇을 의미합니까? "제대로 작동하게하려면"해야합니까? 아니면 "이 동작을 재현해야합니까?"라는 뜻입니까?나는 이것을 Divide (10, 9)로 재현 할 수 없다. 나는 그 경우 경고를 받는다. 어느 쪽이든, 이메일을 보내지는 않았지만 포럼에 게시했습니다. - http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/85473b0a-ea63-45f9-841e-6912c58621a9 – luiscubal

+0

코드 계약이 올바르게 작동하려면 다시 빌드해야했습니다. – Mightymuke