2016-04-04 25 views
5

Ich habe ein Stück Code, die ein wenig wie folgt aussieht:CC Vorschlagen Redundante Sorgt

public TReturn SubRegion(TParam foo) 
{ 
    Contract.Requires(foo!= null); 
    Contract.Ensures(Contract.Result<TReturn>() != null); 

    if (!CheckStuff(foo)) 
     foo.Blah(); 
    return OtherStuff(foo); 
} 

CC gibt mir eine Warnung:

Warning 301 CodeContracts: Betrachten Sie die Nachbedingung Vertrag hinzufügen. Stellt sicher (Contract.Result()! = Null); um den Bibliothekskunden eine zusätzliche Dokumentation zu liefern

Das ist offensichtlich völlig redundant! Ich habe mehrere solche redundanten Warnungen und es wird ein Problem (echte Warnungen werden in einem Strom von redundanten Vorschlägen begraben).

So habe ich zwei Fragen:

1) Bin ich etwas fehlt, was bedeutet, das ist nicht eine redundante Empfehlung? In welchem ​​Fall muss ich diese Warnung beheben?

2) Alternativ, wenn dies nur eine Frage von CCCheck ist und nicht behoben werden kann, wie kann ich diese Warnung verstecken oder unterdrücken?

N.b. Nur für den Fall, dass Sie meinen, dass in meinem Beispiel etwas Wichtiges fehlt, ist der vollständige Code die Subregion Methode here.

+2

Welche Version von Codeverträgen verwenden Sie? –

+1

Mit Blick auf Ihren Code, denke ich, dass das Problem weiter unten liegt. In 'SubRegion' gibt es einen Aufruf von' ConstructFromSlicePart', der wiederum einen Aufruf an 'Construct (IReadOnlyList shape)' hat. Innerhalb von 'Construct' ist die letzte Zeile' return default (TSection) '. Wenn 'TSection' ein Referenztyp ist, gibt die Methode null zurück. Dies könnte die Ursache sein, die sich letztlich als diese Warnung manifestiert. –

+0

CC-Version ist 1.9.10714.2 - soweit ich das sehe ist das das Neueste. re: construct method, sind Sie sicher, dass Sie nicht in der Contracts-Klasse gesucht haben? Die einzige wirkliche Implementierung von Construct ist dies: https://bitbucket.org/martindevans/base-citygeneration/src/0128578a6228487ac3d98398bf0c8ed8bb43d0f5/Base-CityGeneration/Elements/Building/Internals/Floors/Design/Region.cs?at=default&fileviewer=file -view-default # Region.cs-34 die offensichtlich niemals null zurückgibt! – Martin

Antwort

1

Zu 2: Die documentation ist ziemlich gut, einen Blick auf 6.6.10 Filtering Warnmeldungen:

die statische Vertragsprüfung anzuweisen, nicht eine bestimmte Klasse von Warnungen für ein Verfahren zu emittieren (a-Typ, eine Baugruppe), mit Anmerkungen versehen, das Verfahren (der Typ, die assembly) mit dem Attribut:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily)] 

warningFamily wo eines von: Requires, Ensures, Invariant, NonNull, ArrayCreation, ArrayLowerBound, ArrayUpperBound, DivByZero, MinValueNegation.

Bei Bedarf kann die statische Vertragsprüfung auch eine einzelne Warnmeldung (anstelle einer ganzen Familie) filtern. Um dies zu tun Sie eine Methode mit dem Attribute mit Anmerkungen versehen können

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily-ILOffset-MethodILOffset)] 

wo warningFamily ist als oben und ILOffset und MethodILOffset durch den statischen checker Vertrag verwendet werden, um den Programmpunkt zu bestimmen, die Warnung bezieht sich auf. Die Offsets können vom statischen Kontraktprüfer unter abgerufen werden, indem Sie den Schalter -outputwarnmasks im Bereich "Benutzerdefinierte Optionen" in im VS-Bereich bereitstellen. Überprüfen Sie das Build-Ausgabefenster auf die notwendigen Informationen.

+1

Sieht aus, als ob niemand etwas über # 1 hätte, also nehme ich an, dass dies die akzeptierte Antwort ist! – Martin