2011-11-18 3 views
3

다른 클래스의 이벤트 처리기에 가입 한 여러 사용자 컨트롤이 있습니다. 왜 정적 분석기는 다음과 같이 코드를 작성 허용 않습니다 나는 C#에서 CodeContracts을 배우고, 나는 궁금 : 여기왜 CodeContracts 정적 분석기가 경고를 표시하지 않습니까?

void MyUserControl_MouseEnter(object sender, MouseEventArgs e) 
{ 
    MyUserControl item = sender as MyUserControl;  
    item.DoSomething(); // I expect some warning here, because item can be null 

    sender.Equals(testObject); // This doesn't yield warning either 
} 

내가 널 참조 예외로 이어질 수있는, 잠재적으로 안전하지 않은 코드가 있습니다. 정적 분석기가 실제로 확인할 수없는 사실을 알고 있습니다. sender의 실제 유형은 무엇입니까? 그러나 증명할 수없는 경우에는 CodeContracts: Possibly calling a method on a null reference과 같은 경고 메시지가 표시됩니다.

계약서에 대한 잘못된 생각이 들지 않습니까? 이런 오류를 어떻게 알릴 수 있습니까?

UPD :

예, 그것은 답변에서 제안 된대로 내가 Implicit Non-Null Obligation 수 있도록 않았다,하지만 난 여전히 정적 분석기에서 경고를하지 않습니다. 또한 Microsoft All Rules 규칙을 설정하여 코드 분석을 실행하려고했으나 경고도 표시하지 않았습니다. (하지만 코드 계약을 선호하고 if-then-throw 또는 다른 것을 사용하는 대신 Contract 클래스를 사용하여 몇 가지 추가 검사를 수행합니다.)

+0

"암시 적 null 계약"을 활성화 했습니까? – CodesInChaos

답변

0

"Resharper는 다음과 같은 오류를 어떻게 알 수 있습니까?" 이 경우에 경고합니다.

코드 계약서는 객체가 null이 아닌 "Requires"가있는 경우 객체가 null 일 수 있음을 경고합니다. 당신은 객체 dereference에 대해 암시적인 "Requires"를 요구하고 있습니다. 이것은 객체의 참조에서 합리적인 것처럼 보이지만 어떤 이유로 CC가 제공하지 않는 것처럼 보입니다.

http://msdn.microsoft.com/en-us/library/dd264808.aspx의 설명서에는 그러한 암시적인 계약이 시행된다고 나와 있습니다. 나는 그것을 더 깊이 조사하고있다.

레드햇이 저를 때렸습니다. 자세한 내용 : 프로젝트 속성의 코드 계약 탭에서 "정적 검사"아래의 "암시 적 비 공백 의무"확인란을 선택해야합니다.

-1

에서 속성을 규칙을 변경할 수 있습니다 코드 분석 탭에서 프로젝트의 페이지입니다.

+1

코드 분석! = 코드 계약 – SLaks

3

정적 분석기 옵션 (Project Options | Code Analysis)에서 "Implicit Non-Null obligations"를 활성화해야합니다.

0

비슷한 문제가있었습니다. "암시 적 비 Null 의무"확인란과 같은 패널에서 경고 수준 슬라이더를 올려야했습니다.

관련 문제