Freigeben über


Unterdrücken von Codeanalyseverletzungen

Wenn Sie beim Erstellen von Code mit Ihrem Team zusammenarbeiten, ist es häufig hilfreich, darauf hinzuweisen, dass eine Warnung nicht anwendbar ist. Das Unterdrücken von Codeanalyseverletzungen zeigt den Teammitgliedern, dass der Code überprüft wurde und die Warnung unterdrückt werden kann. In den folgenden Abschnitten werden die verschiedenen Methoden zum Unterdrücken von Codeanalyseverstößen mithilfe der Visual Studio-IDE beschrieben.

Unterdrücken von Verstößen mithilfe der EditorConfig-Datei

Fügen Sie in der EditorConfig-Datei für Ihre Lösung oder Ihr Projekt einen Eintrag für jede Regel hinzu, die Sie konfigurieren und den Schweregrad nonefestlegen möchten. Beispiel: dotnet_diagnostic.CA1822.severity = none. Weitere Informationen finden Sie unter Manuelles Konfigurieren des Regelschweregrads in einer EditorConfig-Datei. Informationen zum Hinzufügen einer EditorConfig-Datei finden Sie unter Hinzufügen einer EditorConfig-Datei zu einem Projekt.

Unterdrücken von Verstößen im Quellcode

Sie können Verstöße im Quellcode mithilfe einer Präprozessordirektive unterdrücken, die Verstöße für eine bestimmte Codezeile unterdrückt:

Sie können auch das SuppressMessageAttribute-Attribut verwenden, um eine Warnung in Ihrem C#- und Visual Basic-Code zu unterdrücken.

Unterdrücken von Verstößen mithilfe des Code-Editors

Führen Sie die folgenden Schritte aus, um Verstöße mithilfe des Code-Editors zu unterdrücken:

  1. Platzieren Sie den Cursor in der Codezeile mit der Verletzung, und drücken Sie Strg+Punkt (.) oder Alt+Eingabetaste, um das Menü „Schnelle Aktionen“ zu öffnen.

  2. Wählen Sie 'Unterdrücken oder Konfigurieren von Problemen'><, und wählen Sie dann entweder > oder 'in Quelle (Attribut)' aus.

    • Wenn Sie in "Quelle" auswählen, wird eine Vorschau der Präprozessordirektive angezeigt, die Ihrem Code hinzugefügt wurde.

      Screenshot der Auswahl

    • Wenn Sie in Source (Attribut) auswählen, wird eine Vorschau des SuppressMessageAttribute-Attributs angezeigt, das Ihrem Code hinzugefügt wurde.

      Screenshot, der die Auswahl

Unterdrücken von Verstößen mithilfe der Fehlerliste

Führen Sie die folgenden Schritte aus, um Verstöße mithilfe des Fensters "Fehlerliste " zu unterdrücken:

  1. Wählen Sie im Fenster " Fehlerliste " die Regeln aus, die Sie unterdrücken möchten.

  2. Klicken Sie mit der rechten Maustaste, und wählen Sie dann "In Quelle> aus.

    Das Dialogfeld Änderungsvorschau wird geöffnet und zeigt eine Vorschau der C# #pragma-Warnungsdirektive oder Visual Basic #Disable-Warnungsdirektive an, die dem Quellcode hinzugefügt wurde.

    Screenshot des Dialogfelds

  3. Wählen Sie "Übernehmen" aus, um die Änderungen in Ihrer Codedatei zu speichern.

Diagnosen für den Fehlerlistenaufbau ausschließen

Wenn die Menüoption "Unterdrücken" im Fenster Fehlerliste nicht angezeigt wird, stammt der Fehler wahrscheinlich aus einer Erstellung und nicht aus einer Live-Analyse. Im Fenster " Fehlerliste " werden Diagnose- oder Regelverstöße sowohl aus der Livecodeanalyse als auch aus Builds angezeigt. Da die Builddiagnose veraltet sein kann, z. B. wenn Sie den Code bearbeitet haben, um den Verstoß zu beheben, aber nicht neu erstellt haben, können Sie diese Diagnose nicht immer aus der Fehlerliste unterdrücken.

Diagnosen aus Liveanalyse oder IntelliSense sind immer up-to-Datum mit aktuellen Quellen und können immer aus der Fehlerliste unterdrückt werden. Führen Sie die folgenden Schritte aus, um die Builddiagnose aus Ihrer Auswahl auszuschließen:

  1. Ändern Sie in der Dropdownliste für Quellenfilter der Fehlerliste die Auswahl von Build + IntelliSense zu Nur IntelliSense.

    Screenshot, das den Fehlerlisten-Quellenfilter zeigt.

  2. Wählen Sie die Diagnose aus, die Sie unterdrücken möchten, und fahren Sie wie zuvor beschrieben fort.

Unterdrücken von Verstößen mithilfe einer globalen Unterdrückungsdatei

Die globale Unterdrückungsdatei verwendet das SuppressMessageAttribute-Attribut , um Codeverletzungen zu unterdrücken.

Verwenden einer globalen Unterdrückungsdatei aus dem Code-Editor

Führen Sie die folgenden Schritte aus, um Verstöße mittels einer globalen Unterdrückungsdatei mithilfe des Code-Editors zu unterdrücken:

  1. Platzieren Sie im Code-Editor den Cursor auf einer Codezeile mit einem Verstoß, und drücken Sie Strg+Punkt (.) oder Alt+Eingabetaste, um das Menü Schnellaktionen zu öffnen.

  2. Wählen Sie "Regelnummer< unterdrücken" >und dann in "Unterdrückungsdatei" aus.

    Visual Studio erstellt eine Registerkarte im Code-Editor, die die neue globale Unterdrückungsdatei enthält.

Verwenden Sie eine globale Unterdrückungsdatei von der Fehlerliste

Führen Sie die folgenden Schritte aus, um Verstöße mit einer globalen Unterdrückungsdatei mithilfe des Fensters Fehlerliste zu unterdrücken:

  1. Wählen Sie im Fenster " Fehlerliste " die Regeln aus, die Sie unterdrücken möchten.

  2. Klicken Sie mit der rechten Maustaste, und wählen Sie dann Unterdrücken>In Unterdrückungsdatei aus.

    Das Dialogfeld "Vorschau der Änderungen" wird geöffnet und zeigt eine Vorschau des Attributs an, das SuppressMessageAttribute der globalen Unterdrückungsdatei hinzugefügt wurde.

    Screenshot des Dialogfelds

  3. Wählen Sie Speichern aus, um die globale Unterdrückungsdatei zu sichern.

Alle aktuellen Verstöße unterdrücken

Das Unterdrücken aller aktuellen Verstöße wird manchmal als Baselining bezeichnet. Führen Sie die folgenden Schritte aus, um alle aktuellen Verstöße in einer Lösung oder einem Projekt zu unterdrücken:

  1. Wählen Sie in der Visual Studio-Menüleiste "Build analysieren>" und "Aktive Probleme unterdrücken" aus.

  2. Wählen Sie "Zur Lösung" aus, um Verstöße für die gesamte Lösung zu unterdrücken, oder wählen Sie "Für Projektname<" > aus, um Verstöße nur für Ihr Projekt zu unterdrücken.

Unterdrücken von Verstößen mithilfe von Projekteinstellungen

Führen Sie die folgenden Schritte aus, um Verstöße mithilfe der Projekteinstellungen des Projektmappen-Explorers zu unterdrücken:

  1. Wählen Sie im Projektmappen-Explorer Ihr Projekt aus.

  2. Klicken Sie mit der rechten Maustaste, und wählen Sie dann "Eigenschaften" aus (oder drücken Sie ALT+EINGABETASTE).

  3. Öffnen Sie im Eigenschaften-Fenster den Bereich Codeanalyse im linken Fenster, und deaktivieren Sie dann Ergebnisse aus generiertem Code unterdrücken.

Unterdrücken von Verstößen mithilfe eines Regelsatzes

Deaktivieren Sie im Regelsatz-Editor das Kontrollkästchen neben dem Namen, oder legen Sie "Aktion" auf "Keine" fest.

In-Source-Unterdrückung und das SuppressMessageAttribute-Attribut

Die Quellunterdrückung (ISS) verwendet das SuppressMessageAttribute-Attribut, um eine Warnung zu unterdrücken. Sie können das SuppressMessageAttribute Attribut der Quelldatei in der Nähe des Codesegments hinzufügen, das die Warnung generiert hat.

Sie können das Attribut entweder manuell im Code-Editor eingeben oder das Attribut automatisch wie folgt hinzufügen:

  1. Platzieren Sie im Code-Editor den Cursor auf einer Codezeile mit einem Verstoß, und drücken Sie Strg+Punkt (.) oder Alt+Eingabetaste, um das Menü Schnellaktionen zu öffnen.

  2. Wählen Sie "Probleme unterdrücken oder konfigurieren>Regelnummer <unterdrücken>" aus dem Menü "Schnelle Aktionen" aus.

  3. Führen Sie einen der folgenden Schritte aus:

    • Wählen Sie in Quelle (Attribut) aus.

      Visual Studio fügt Ihrem Code ein SuppressMessageAttribute Attribut hinzu.

    • Wählen Sie in "Unterdrückungsdatei" aus.

      Visual Studio erstellt eine Registerkarte im Code-Editor, die eine neue globale Unterdrückungsdatei mit SuppressMessageAttribute Attributen enthält.

Das SuppressMessageAttribute Attribut ist ein bedingtes Attribut, das in den Metadaten der Assembly mit verwaltetem Code enthalten ist. Dieses Attribut ist nur enthalten, wenn das CODE_ANALYSIS Kompilierungssymbol zur Kompilierungszeit definiert ist.

Verwenden Sie nur in C++ und CLI-Code die Makros CA_SUPPRESS_MESSAGE oder CA_GLOBAL_SUPPRESS_MESSAGE in der Headerdatei, um das Attribut hinzuzufügen.

Wenn Sie ein Projekt zur neuesten Version von Visual Studio migrieren, wird möglicherweise eine große Anzahl von Codeanalysewarnungen angezeigt. Wenn Sie nicht bereit sind, die Warnungen zu beheben, können Sie alle unterdrücken, indem Sie "Build analysieren>" und "Aktive Probleme unterdrücken" auswählen.

Hinweis

Verwenden Sie bei Releasebuilds keine In-Source-Unterdrückungen, um ein versehentliches Bereitstellen der In-Source-Unterdrückungs-Metadaten zu verhindern.

Format des SuppressMessageAttribute-Attributs

Das SuppressMessageAttribute Attribut weist das folgende Format auf:

[Scope:SuppressMessage("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")]

Die Eigenschaften des Attributs umfassen:

  • Category: Die Kategorie der Regel. Weitere Informationen zu Codeanalyseregelkategorien finden Sie unter Codequalitätsregeln.

  • CheckId: Der Bezeichner der Regel. Die Unterstützung umfasst sowohl einen kurzen als auch einen langen Namen für den Regelbezeichner. Der Kurzname lautet CAXXXX; der lange Name lautet CAXXXX:FriendlyTypeName.

  • Justification: Der Text, der zum Dokumentieren des Grunds für die Unterdrückung der Nachricht verwendet wird.

  • MessageId: Der eindeutige Bezeichner des Problems für jede Nachricht.

  • Scope: Das Ziel, für das die Warnung unterdrückt wird. Wenn das Ziel nicht angegeben ist, setzt das System es auf das Ziel des Attributs. Zu den unterstützten Bereichen gehören:

    • module: Dieser Bereich unterdrückt Warnungen gegen eine Assembly. Es ist eine globale Unterdrückung, die für das gesamte Projekt gilt.

    • resource: (Nur Legacy FxCop) Dieser Bereich unterdrückt Warnungen in Diagnoseinformationen, die in Ressourcendateien geschrieben wurden, die Teil des Moduls (Assembly) sind. Dieser Bereich wird in C#/VB-Compilern für die Roslyn-Analysediagnose nicht gelesen oder berücksichtigt, die nur Quelldateien analysieren.

    • type: Dieser Gültigkeitsbereich unterdrückt Warnungen für einen Typ.

    • member: Dieser Bereich unterdrückt Warnungen gegenüber einem Mitglied.

    • namespace: Dieser Bereich unterdrückt Warnungen gegen den Namespace selbst. Warnungen gegen Typen innerhalb des Namespaces werden nicht unterdrückt.

    • namespaceanddescendants: (Erfordert Compilerversion 3.x oder höher und Visual Studio 2019 oder höher) Dieser Bereich unterdrückt Warnungen in einem Namespace und alle untergeordneten Symbole. Legacyanalyse ignoriert den namespaceanddescendants Wert.

  • Target: Ein Bezeichner, der das Ziel angibt, für das die Warnung unterdrückt wird. Er muss einen vollqualifizierten Komponentennamen enthalten.

Wenn Warnungen in Visual Studio angezeigt werden, können Sie zu Beispiele SuppressMessageAttribute anzeigen, indem Sie eine Unterdrückung zur globalen Unterdrückungsdatei hinzufügen. Das Unterdrückungsattribut und die erforderlichen Eigenschaften werden in einem Vorschaufenster angezeigt.

SuppressMessageAttribute-Verwendung

Codeanalysewarnungen werden auf der Ebene unterdrückt, auf die das SuppressMessageAttribute Attribut angewendet wird. Das Attribut kann beispielsweise auf Assembly-, Modul-, Typ-, Member- oder Parameterebene angewendet werden. Der Zweck der Anwendung dieses Attributs besteht darin, die Unterdrückungsinformationen eng mit dem Code zu koppeln, in dem die Verletzung auftritt.

Die allgemeine Form der Unterdrückung umfasst die Regelkategorie und einen Regelbezeichner, der eine optionale lesbare Darstellung des Regelnamens enthält. Beispiel:

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

Wenn es strenge Leistungsgründe für die Minimierung von Metadaten für die In-Source-Unterdrückung gibt, kann der Regelname weggelassen werden. Die Regelkategorie und ihre Regel-ID bilden zusammen einen hinreichend eindeutigen Regelbezeichner. Beispiel:

[SuppressMessage("Microsoft.Design", "CA1039")]

Aus Wartungsgründen wird das Weglassen des Regelnamens nicht empfohlen.

Selektive Verstöße innerhalb eines Methodenkörpers unterdrücken

Unterdrückungsattribute können auf eine Methode angewendet werden, können aber nicht in einen Methodentext eingebettet werden. Alle Verstöße gegen eine bestimmte Regel werden unterdrückt, wenn Sie das SuppressMessageAttribute Attribut zur Methode hinzufügen.

In einigen Fällen möchten Sie möglicherweise einen bestimmten Fall der Verletzung unterdrücken. Betrachten Sie das Beispiel, in dem zukünftiger Code nicht automatisch von der Codeanalyseregel ausgenommen wird. Mit bestimmten Codeanalyseregeln können Sie eine bestimmte Instanz des Verstoßes mithilfe der MessageId Eigenschaft des SuppressMessageAttribute Attributs unterdrücken. Im Allgemeinen beachten Legacyregeln für Verstöße gegen ein bestimmtes Symbol (eine lokale Variable oder einen Parameter) die MessageId Eigenschaft. CA1500:VariableNamesShouldNotMatchFieldNames ist ein Beispiel für eine solche Regel. Althergebrachte Regeln für Verstöße gegen ausführbaren Code (nicht-Symbol) respektieren die MessageId Eigenschaft nicht. Außerdem respektieren .NET Compiler Platform ("Roslyn") Analyzer die MessageId Eigenschaft nicht.

Um eine bestimmte Symbolverletzung einer Regel zu unterdrücken, geben Sie den Symbolnamen für die MessageId Eigenschaft des SuppressMessageAttribute Attributs an. Das folgende Beispiel zeigt Code mit zwei Verletzungen von CA1500:VariableNamesShouldNotMatchFieldNames: eine Verletzung für die name Variable und eine andere Verletzung für die age Variable. Nur der Verstoß für das age Symbol wird unterdrückt.

public class Animal
{
    int age;
    string name;

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
    private void PrintInfo()
    {
        int age = 5;
        string name = "Charlie";

        Console.WriteLine($"Age {age}, Name {name}");
    }
}

Unterdrückung auf globaler Ebene

Das Analysetool für verwalteten Code untersucht die SuppressMessageAttribute Attribute, die auf Assembly-, Modul-, Typ-, Member- oder Parameterebene angewendet werden. Außerdem werden Verstöße gegen Ressourcen und Namespaces gemeldet. Diese Verstöße müssen auf globaler Ebene angewendet werden und gezielt sein. Die folgende Meldung unterdrückt beispielsweise eine Namespaceverletzung:

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

Für Unterdrückungen auf globaler Ebene:

  • Wenn Sie eine Warnung mit einem namespace Bereich unterdrücken, wird die Warnung gegen den Namespace selbst unterdrückt. Die Warnung gegen Typen innerhalb des Namespaces wird nicht unterdrückt.

  • Target enthält immer den vollqualifizierten Objektnamen.

  • Jede Unterdrückung kann durch Angabe eines expliziten Bereichs ausgedrückt werden. Diese Unterdrückungen müssen auf globaler Ebene bestehen. Sie können die Unterdrückung auf Memberebene nicht definieren, indem Sie einen Typ ändern.

  • Unterdrückungen auf globaler Ebene sind die einzige Möglichkeit, Nachrichten zu unterdrücken, die auf vom Compiler generierten Code verweisen, der nicht explizit bereitgestellten Benutzerquelle zugeordnet ist. Der folgende Code unterdrückt beispielsweise einen Verstoß gegen einen vom Compiler ausgegebenen Konstruktor:

    [module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

Globale Unterdrückungsdatei

Die globale Unterdrückungsdatei führt Unterdrückungen auf, die entweder auf globaler Ebene sind oder kein spezifisches Ziel angeben. Beispielsweise werden Unterdrückungen für Verstöße auf Assemblyebene in dieser Datei gespeichert. Darüber hinaus werden einige ASP.NET-Unterdrückungen in dieser Datei gespeichert, da Einstellungen auf Projektebene für Code im Hintergrund eines Formulars nicht verfügbar sind. Visual Studio erstellt und fügt Ihrem Projekt eine globale Unterdrückungsdatei hinzu, wenn Sie zum ersten Mal die Option In Projektunterdrückungsdatei im Fehlerliste-Fenster des Befehls Unterdrücken auswählen.

Modul-Ausschaltungsbereich

Sie können Codequalitätsverletzungen für die gesamte Assembly mithilfe des module Anwendungsbereichs unterdrücken.

Das folgende Attribut in Ihrer GlobalSuppressions-Projektdatei unterdrückt beispielsweise die ConfigureAwait-Verletzung für ein ASP.NET Core-Projekt:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]

Generierter Code

Verwaltete Codecompiler und einige externe Tools generieren Code, um die schnelle Codeentwicklung zu erleichtern. Compilergenerierter Code, der in Quelldateien angezeigt wird, wird mit dem GeneratedCodeAttribute Attribut gekennzeichnet.

Bei der Quellcodeanalyse können Sie Nachrichten in generierten Code in einer EDITORCONFIG-Datei unterdrücken. Weitere Informationen finden Sie unter Ausschließen von generierten Code.

Bei der Analyse von Legacy-Code können Sie auswählen, ob Codeanalysewarnungen und Fehler bei generiertem Code unterdrückt werden sollen. Informationen zum Unterdrücken solcher Warnungen und Fehler finden Sie unter Unterdrücken von Codeanalysewarnungen für generierten Code.

Hinweis

Die Codeanalyse ignoriert GeneratedCodeAttribute, wenn sie entweder auf eine gesamte Assembly oder einen einzelnen Parameter angewendet wird.