2010-06-01 6 views
21

Podczas korzystania Code Analysis i umów kod w połączeniu, dostaję dużo ostrzeżeń jakCzy można dokonać analizy kodu, aby zrozumieć, jakie są kontrakty kodowe?

CA1062: Microsoft.Design: W widocznym z zewnątrz metodą „Foo.Bar (log)”, walidacji parametru „log” przed użyciem .

W Foo.Bar, mam umowę, która potwierdza log.

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

Czy istnieje sposób, aby FxCop zrozumiał umowy na kod?

+0

Spodziewam się, że można napisać dodatek FxCop do wykonania pracy. – GaTechThomas

+1

Terje Sandstrom ma świetny wpis na blogu, który odpowiada na to: http://geekswithblogs.net/terje/archive/2010/10/14/making-static-code-analysis-and-code-contracts-work-together-or. aspx –

+0

@Angerico Cariño Zaktualizowałem wyżej wymieniony blog z nowymi informacjami dotyczącymi obejścia tego problemu. –

Odpowiedz

14

Nie Nie sądzę, że jest to możliwe w obecnej wersji, ponieważ kod generowany przez przebudowującego kontrakty nie generuje standardowego wzorca, którego szuka FxCop.

Zazwyczaj jednak wyłączam tę konkretną regułę FxCop podczas korzystania z kontraktów kodu. Uważam, że weryfikator statyczny bardziej niż rekompensuje utratę tej reguły, ponieważ będzie krzyczeć o braku sprawdzenia znacznie agresywniej niż FxCop. Sugerowałbym to samo podejście, które naprawi ten problem.

+3

Aby faktycznie zrobić w tej pracy musisz wykonać kilka zadań: 1. Wyłącz CA1062 w analizie kodu - 2. Włącz "Wykonuj sprawdzanie statycznego kontraktu" w okienku Kontraktów kodowych projektu - ** 3. Włącz "Implicit Non-Null Obligations" - 4. Ustaw poziom ostrzegawczy na "cześć" (ważne, tego właśnie mi brakowało!) ** –

+0

Od wersji 4.5.2 ram można bezpośrednio informować o analizie kodowej egzekwowanych umów kodowych. Sprawdź moją odpowiedź poniżej. –

-2

określić wyjątek ArgumentNullException takiego:

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

FxCop spodziewa się, aby rzuca wyjątek ArgumentNullException ...

+0

to działa z fxcop, a także z analizą kodu (premium i ultimate). –

+7

To nie działa z urzędem certyfikacji - przy użyciu zestawu reguł "Wszystkie reguły Microsoft" CA1062 nadal jest ostrzegany. VS 2010 sp1, umowa na kod 1.4.40314.1 –

+0

Ktoś przetestował CA1062 z 2012 roku ??? – felickz

3

Tak, as noted in my answer here, od wersji 4.5.2 ram (ewentualnie 4.5) możliwe jest informowanie o analizie Code of the Code Code, która jest egzekwowana. Metoda rozszerzenia i klasa atrybutu znacznika muszą być zdefiniowane następująco:

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 {} 

Dodatkowe informacje znajdują się w mojej drugiej odpowiedzi.

+1

Mimo że jest to dobre rozwiązanie, nie jest to "informowanie o analizie kodu na temat kontraktów kodu". Jest to sprytna sztuczka, która przenosi wszystkie naruszenia w jedno miejsce (metoda 'ContractedNotNull') i tłumi tam ostrzeżenie. – BartoszKP

+0

@BartoszKP: Chociaż widzę twoją sprawę, to wciąż chodzi i szarpie jak kaczka; wybacz mi, jeśli nazywam to kaczką. –

Powiązane problemy