2010-06-01 7 views
21

, 나는코드 분석에서 코드 계약을 이해할 수 있습니까? Microsoft.Design : 코드 분석과 함께 코드 계약을 사용하여

CA1062 같은 경고를 많이 얻을 외부에서 볼 수있는 방법 'Foo.Bar (로그인)'에서 사용하기 전에 '로그인'매개 변수의 유효성을 검사 .

Foo.Bar에서 log의 유효성을 검사하는 계약이 있습니다.

public Bar(Log log) 
{ 
    Contract.Requires(log != null); 
    log.Lines.Add(...); 
    // ... 
} 

FxCop이 코드 계약을 이해할 수있는 방법이 있습니까?

+0

작업을 수행하기 위해 FxCop 추가 기능을 작성할 수 있다고 기대합니다. – GaTechThomas

+1

Terje Sandstrom은 이에 대한 답변을 제공하는 훌륭한 블로그 항목을 가지고 있습니다. http://geekswithblogs.net/terje/archive/2010/10/14/making-static-code-analysis-and-code-contracts-work-together-or. aspx –

+0

@Angerico Cariño이 문제에 대한 해결 방법과 관련된 몇 가지 새로운 정보로 위에서 언급 한 블로그 게시물을 업데이트했습니다. –

답변

14

아니요 계약서 작성자가 생성 한 코드가 FxCop이 찾고있는 표준 패턴을 생성하지 않기 때문에 현재 빌드에서는 가능하지 않다고 생각합니다.

일반적으로 코드 계약을 사용할 때이 특정 FxCop 규칙을 사용하지 않지만. 정적 검증자는 FxCop보다 훨씬 적극적으로 점검하지 않는 것에 대해 큰 소리로 외칠 것입니다. 나는 당신을 위해이 문제를 해결할 동일한 접근을 제안 할 것이다.

+3

실제로 만들려면 1. 코드 분석에서 CA1062를 비활성화합니다 - 2. 프로젝트의 코드 계약 창에서 "정적 계약 검사 수행"을 활성화합니다 - ** 3. "암시 적 비 Null 채무 활성화"를 활성화합니다 - 4. 경고 레벨을 "hi"로 설정하십시오. (중요한 것은 내가 놓친 것이 었습니다!) ** –

+0

프레임 워크 4.5.2 버전부터 시행되는 코드 계약에 대한 코드 분석을 직접 통보하는 것이 가능합니다. 아래 내 대답을 확인하십시오. –

-2

이 같은 경우 ArgumentNullException 예외 지정 체계 버전 4.5.2로,

public Bar(Log log) 
{ 
    Contract.Requires<ArgumentNullException>(log != null); 
    log.Lines.Add(...); 
    // ... 
} 

의 FxCop가에 기대하는 경우 ArgumentNullException 예외가 발생 ...

+0

이것은 fxcop 및 코드 분석 (프리미엄 및 궁극)과 함께 작동합니다. –

+7

이것은 CA에서 작동하지 않습니다. 'Microsoft 모든 규칙'규칙 세트를 사용하면 CA1062가 여전히 경고로 처리됩니다. VS 2010 sp1, 코드 계약 1.4.40314.1 –

+0

누구나 테스트를 통해 2012 년 CA1062 ??? – felickz

3

as noted in my answer here을 (아마도 4.5) 시행중인 코드 계약을 코드 분석에 알릴 수 있습니다. 확장 메소드 및 마커 속성 클래스는 다음과 같이 정의해야합니다.

public static class ContractExtensions { 
    /// <summary>Throws <c>ContractException{name}</c> if <c>value</c> is null.</summary> 
    /// <param name="value">Value to be tested.</param> 
    /// <param name="name">Name of the parameter being tested, for use in the exception thrown.</param> 
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value")] 
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "name")] 
    [ContractAbbreviator] // Requires Assemble Mode = Standard Contract Requires 
    public static void ContractedNotNull<T>([ValidatedNotNull]this T value, string name) where T : class { 
     Contract.Requires(value != null,name); 
    } 
    } 

/// <summary>Decorator for an incoming parameter that is contractually enforced as NotNull.</summary> 
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] 
public sealed class ValidatedNotNullAttribute : global::System.Attribute {} 

추가 세부 사항은 다른 대답입니다.

+1

좋은 솔루션이지만, "코드 계약에 대한 코드 분석 정보"가 아닙니다. 그것은 모든 위반을 하나의 장소 ('ContractedNotNull' 메쏘드)로 옮기고 그곳의 경고를 억제하는 영리한 트릭입니다. – BartoszKP

+0

@BartoszKP : 나는 당신의 요점을 보았지만 여전히 오리처럼 걷고 돌팔이를 던졌습니다. 내가 오리라고 부른다면 용서해주세요. –