Freigeben über


Regeln für Codequalität

Die .NET-Codeanalyse stellt Regeln zur Verbesserung der Codequalität zur Verfügung. Die Regeln sind in Bereiche wie Entwurf, Globalisierung, Leistung und Sicherheit gegliedert. Bestimmte Regeln gelten speziell für die Verwendung der .NET-API, während es bei anderen um die Qualität von generischem Code geht.

Regelindex

In der folgenden Tabelle sind die Regeln für die Codequalitätsanalyse aufgeführt.

Regel-ID und Warnung Beschreibung
CA1000: Statische Member nicht in generischen Typen deklarieren. Wenn ein statischer Member eines generischen Typs aufgerufen wird, muss das Typargument für den Typ angegeben werden. Wenn ein generischer Instanzmember, der keine Unterstützung für Rückschlüsse bietet, aufgerufen wird, muss das Typargument für den Member angegeben werden. In diesen beiden Fällen ist die Syntax zum Angeben des Typarguments unterschiedlich und leicht zu verwechseln.
CA1001: Typen, die löschbare Felder besitzen, müssen gelöscht werden können. Eine Klasse deklariert und implementiert ein Instanzenfeld, das den System.IDisposable-Typ aufweist, IDisposable jedoch nicht implementiert. Eine Klasse, die ein IDisposable-Feld deklariert, besitzt indirekt eine nicht verwaltete Ressource und sollte die IDisposable-Schnittstelle implementieren.
CA1002: Generische Listen nicht verfügbar machen. „System.Collections.Generic.List<(Of <(T>)>)“ ist eine generische Auflistung, die im Hinblick auf Leistung und nicht Vererbung entwickelt wurde. Daher enthält List keine virtuellen Member. Stattdessen sollten die generischen Auflistungen, die im Hinblick auf die Vererbung entworfen wurden, verfügbar gemacht werden.
CA1003: Generische Ereignishandlerinstanzen verwenden. Ein Typ enthält einen Delegaten, der void zurückgibt. Die zugehörige Signatur enthält zwei Parameter (der erste ist ein Objekt, der zweite ein Typ, der EventArgs zugewiesen werden kann), und Microsoft .NET Framework 2.0 ist Ziel der enthaltenden Assembly.
CA1005: Übermäßige Anzahl von Parametern in generischen Typen vermeiden. Je mehr Typparameter ein generischer Typ enthält, desto schwieriger ist es, zu wissen und zu behalten, was die einzelnen Typparameter darstellen. In der Regel ist dies bei einem Typparameter offensichtlich, z. B. „List<T>“, und in bestimmten Fällen auch bei zwei Typparametern, z. B. in „Dictionary<TKey, TValue>. Mehr als zwei Typparameter hingegen bereiten den meisten Benutzern Schwierigkeiten.
CA1008: Enumerationen müssen einen Wert von 0 (null) aufweisen. Der Standardwert einer nicht initialisierten Enumeration ist ebenso wie der anderer Werttypen 0 (null). Eine Enumeration ohne das Flags-Attribut sollte einen Member mit dem Wert 0 (null) definieren, damit der Standardwert ein gültiger Wert der Enumeration ist. Wenn eine Enumeration, auf die FlagsAttribute angewendet wird, einen Member mit dem Wert 0 (null) definiert, sollte dieser den Namen "None" haben, um anzugeben, dass in der Enumeration keine Werte festgelegt wurden.
CA1010: Sammlungen müssen eine generische Schnittstelle implementieren. Um die Verwendbarkeit einer Auflistung zu erweitern, implementieren Sie eine der generischen Auflistungsschnittstellen. Anschließend kann die Auflistung zum Auffüllen generischer Auflistungstypen verwendet werden.
CA1012: Abstrakte Typen dürfen keine öffentlichen Konstruktoren enthalten Konstruktoren von abstrakten Datentypen können nur von abgeleiteten Typen aufgerufen werden. Da öffentliche Konstruktoren Instanzen eines Typs erstellen und Sie keine Instanzen eines abstrakten Datentyps erstellen können, ist ein abstrakter Datentyp mit einem öffentlichen Konstruktor fehlerhaft konzipiert.
CA1014: Assemblys mit CLSCompliantAttribute markieren. In der Common Language Specification (CLS) sind Benennungseinschränkungen, Datentypen und Regeln definiert, denen Assemblys entsprechen müssen, wenn sie in verschiedenen Programmiersprachen verwendet werden sollen. Um guten Entwurfsprinzipien gerecht zu werden, muss bei allen Assemblys die CLS-Kompatibilität mit CLSCompliantAttribute explizit angegeben werden. Wenn das Attribut in einer Assembly nicht vorhanden ist, ist die Assembly nicht kompatibel.
CA1016: Assemblys mit AssemblyVersionAttribute markieren. .NET verwendet die Versionsnummer für die eindeutige Identifizierung einer Assembly und für das Binden an Typen innerhalb von Assemblys mit starkem Namen. Die Versionsnummer wird zusammen mit der Versions- und Herausgeberrichtlinie verwendet. Standardmäßig werden Anwendungen nur mit der Assemblyversion ausgeführt, mit der sie erstellt wurden.
CA1017: Assemblys mit ComVisibleAttribute markieren. Das ComVisibleAttribute-Attribut bestimmt, wie COM-Clients auf verwalteten Code zugreifen. Gute Entwurfsprinzipien verlangen, dass die COM-Sichtbarkeit durch Assemblys explizit angegeben wird. Die COM-Sichtbarkeit kann für die gesamte Assembly festgelegt und anschließend für einzelne Typen und Typmember überschrieben werden. Wenn das Attribut fehlt, ist der Inhalt der Assembly für COM-Clients sichtbar.
CA1018: Attribute mit AttributeUsageAttribute markieren. Wenn Sie ein benutzerdefiniertes Attribut definieren, markieren Sie es mithilfe von AttributeUsageAttribute, um anzugeben, an welcher Stelle im Quellcode das benutzerdefinierte Attribut angewendet werden kann. Die Bedeutung und die beabsichtigte Verwendung eines Attributs bestimmen die gültigen Positionen des Attributs im Code.
CA1019: Accessoren für Attributargumente definieren. Attribute können obligatorische Argumente definieren, die angegeben werden müssen, wenn das Attribut auf ein Ziel angewendet wird. Diese Argumente werden auch als positionelle Argumente bezeichnet, da sie bei Attributkonstruktoren als positionelle Parameter angegeben werden. Für jedes obligatorische Argument muss das Attribut außerdem eine entsprechende schreibgeschützte Eigenschaft enthalten, damit der Wert des Arguments zur Ausführungszeit abgerufen werden kann. Attribute können auch optionale Argumente definieren, die auch als benannte Argumente bezeichnet werden. Diese Argumente werden bei Attributkonstruktoren über ihren Namen angegeben und sollten über eine entsprechende Lese-Schreib-Eigenschaft verfügen.
CA1021: out-Parameter vermeiden. Die Übergabe von Typen als Verweis (mit out oder ref) erfordert Erfahrung im Umgang mit Zeigern, Kenntnisse der Unterschiede zwischen Wert- und Verweistypen und Erfahrung im Umgang mit Methoden mit mehreren Rückgabewerten. Außerdem ist der Unterschied zwischen dem out-Parameter und dem ref-Parametern oft unklar.
CA1024: Nach Möglichkeit Eigenschaften verwenden. Eine öffentliche oder geschützte Methode hat einen Namen, der mit "Get" beginnt. Sie nimmt keine Parameter an und gibt einen Wert zurück, bei dem es sich nicht um ein Array handelt. Die Methode ist möglicherweise als Eigenschaft geeignet.
CA1027: Enumerationen mit FlagsAttribute markieren. Eine Enumeration ist ein Werttyp, der einen Satz verwandter benannter Konstanten definiert. Wenden Sie FlagsAttribute auf eine Enumeration an, wenn deren benannte Konstanten sinnvoll kombiniert werden können.
CA1028: Der Enumerationsspeicher sollte Int32 sein. Eine Enumeration ist ein Werttyp, der einen Satz verwandter benannter Konstanten definiert. Standardmäßig wird zum Speichern des konstanten Werts der System.Int32-Datentyp verwendet. Sie können diesen zugrunde liegenden Typ zwar ändern, in den meisten Szenarien ist dies jedoch weder notwendig noch empfehlenswert.
CA1030: Nach Möglichkeit Ereignisse verwenden. Diese Regel erkennt Methoden, deren Namen normalerweise für Ereignisse verwendet würden. Wenn eine Methode auf eine klar definierte Zustandsänderung hin aufgerufen wird, sollte die Methode von einem Ereignishandler aufgerufen werden. Objekte, die die Methode aufrufen, sollten Ereignisse auslösen, statt die Methode direkt aufzurufen.
CA1031: Allgemeine Ausnahmetypen nicht auffangen. Allgemeine Ausnahmen sollten nicht abgefangen werden. Fangen Sie eine spezifischere Ausnahme ab, oder lösen Sie die allgemeine Ausnahme in der letzten Anweisung des catch-Blocks erneut aus.
CA1032: Standardausnahmekonstruktoren implementieren. Falls nicht der vollständige Satz von Konstruktoren angegeben wird, wird eine ordnungsgemäße Behandlung von Ausnahmen unter Umständen erschwert.
CA1033: Schnittstellenmethoden sollten von untergeordneten Typen aufgerufen werden können. Ein unversiegelter, extern sichtbarer Typ gibt eine explizite Methodenimplementierung einer öffentlichen Schnittstelle an und gibt keine alternative extern sichtbare Methode mit dem gleichen Namen an.
CA1034: Geschachtelte Typen sollten nicht sichtbar sein. Ein geschachtelter Typ ist ein Typ, der innerhalb des Gültigkeitsbereichs eines anderen Typs deklariert ist. Geschachtelte Typen eignen sich für die Kapselung privater Implementierungsdetails der enthaltenden Typen. Bei dieser Verwendungsart sollten geschachtelte Typen nicht extern sichtbar sein.
CA1036: Methoden bei vergleichbaren Typen überschreiben. Ein öffentlicher oder geschützter Typ implementiert die System.IComparable-Schnittstelle. Er überschreibt Object.Equals nicht und überlädt auch nicht den sprachspezifischen Operator für gleich, ungleich, kleiner als und größer als.
CA1040: Leere Schnittstellen vermeiden. Schnittstellen definieren Member, die ein Verhalten oder einen Verwendungsvertrag bereitstellen. Die durch die Schnittstelle beschriebene Funktionalität kann von jedem Typ übernommen werden, unabhängig davon, an welcher Stelle der Typ in der Vererbungshierarchie steht. Ein Typ implementiert eine Schnittstelle, indem er Implementierungen für die Member der Schnittstelle bereitstellt. Eine leere Schnittstelle definiert keine Member. Daher definiert sie keinen Vertrag, der implementiert werden kann.
CA1041: ObsoleteAttribute-Meldung bereitstellen. Ein Typ oder Member wird mit einem System.ObsoleteAttribute-Attribut markiert, dessen ObsoleteAttribute.Message-Eigenschaft nicht angegeben wurde. Wenn ein mit ObsoleteAttribute markierter Typ oder Member kompiliert wird, wird die Message-Eigenschaft des Attributs angezeigt. Auf diese Weise erhält der Benutzer Informationen zum veralteten Typ oder Member.
CA1043: Ganzzahliges Argument oder Zeichenfolgenargument für Indexer verwenden. Indexer (d. h. indizierte Eigenschaften) sollten ganzzahlige Typen oder Zeichenfolgentypen für den Index verwenden. Diese Typen werden i. d. R. zum Indizieren von Datenstrukturen verwendet und erweitern den Einsatzbereich der Bibliothek. Die Verwendung des Object-Typs sollte auf die Fälle beschränkt werden, in denen der spezielle integrale oder Zeichenfolgentyp zur Entwurfszeit nicht angegeben werden kann.
CA1044: Eigenschaften sollten nicht lesegeschützt sein. Obwohl eine schreibgeschützte Eigenschaft akzeptabel und oft erforderlich ist, verhindern die Entwurfsrichtlinien die Verwendung von Eigenschaften, die nur geschrieben werden können. Wenn ein Benutzer einen Wert festlegen kann, bietet es keinerlei Sicherheitsvorteile, das Lesen und Anzeigen des Werts durch den Benutzer zu sperren. Außerdem kann der Zustand freigegebener Objekte ohne Lesezugriff nicht angezeigt werden, wodurch ihre Nützlichkeit eingeschränkt wird.
CA1045: Typen nicht als Verweis übergeben. Die Übergabe von Typen als Verweis (mit out oder ref) erfordert Erfahrung im Umgang mit Zeigern, Kenntnisse der Unterschiede zwischen Wert- und Verweistypen und Erfahrung im Umgang mit Methoden mit mehreren Rückgabewerten. Bibliotheksarchitekten, die für eine allgemeine Zielgruppe entwerfen, sollten nicht erwarten, dass Benutzer das Arbeiten mit out- oder ref-Parametern beherrschen.
CA1046: Gleichheitsoperator für Referenztypen nicht überladen. Für Verweistypen ist die Standardimplementierung des Gleichheitsoperators fast immer zutreffend. Standardmäßig sind zwei Verweise nur dann gleich, wenn sie auf dasselbe Objekt zeigen.
CA1047: Geschützte Member in versiegelten Typen nicht deklarieren. Typen deklarieren geschützte Member, damit erbende Typen auf den Member zugreifen oder diesen überschreiben können. Per Definition kann von versiegelten Typen nicht geerbt werden. Dies bedeutet, dass geschützte Methoden für versiegelte Typen nicht aufgerufen werden können.
CA1050: Typen in Namespaces deklarieren. Typen werden in Namespaces deklariert, um Namenskonflikte zu verhindern und um verwandte Typen in einer Objekthierarchie zu organisieren.
CA1051: Sichtbare Instanzfelder nicht deklarieren. Ein Feld sollte primär als Implementierungsdetail verwendet werden. Felder sollten privat oder intern sein und durch die Verwendung von Eigenschaften verfügbar gemacht werden.
CA1052: Statische Haltertypen sollten versiegelt sein. Ein öffentlicher oder geschützter Typ enthält nur statische Member und wird nicht mit dem sealed (C#-Referenz)-Modifizierer (NotInheritable) deklariert. Ein Typ, der nicht geerbt werden soll, sollte mit dem sealed-Modifizierer markiert werden, um seine Verwendung als Basistyp zu verhindern.
CA1053: Statische Haltertypen sollten keine Konstruktoren aufweisen. Ein öffentlicher oder verschachtelter öffentlicher Typ deklariert nur statische Member und verfügt über einen öffentlichen oder geschützten Standardkonstruktor. Der Konstruktor ist überflüssig, da zum Aufrufen statischer Member keine Instanz des Typs erforderlich ist. Die Zeichenfolgenüberladung sollte die URI-Überladung aus Sicherheitsgründen mit dem Zeichenfolgenargument aufrufen.
CA1054: URI-Parameter dürfen keine Zeichenfolgen sein. Wenn eine Methode eine Zeichenfolgendarstellung eines URIs annimmt, sollte eine entsprechende Überladung angegeben werden, die eine Instanz der URI-Klasse annimmt, die diese Dienste auf sichere Weise bereitstellt.
CA1055: URI-Rückgabewerte dürfen keine Zeichenfolgen sein. Diese Regel geht davon aus, dass die Methode einen URI zurückgibt. Eine Zeichenfolgendarstellung eines URIs ist anfällig für Analyse- und Codierungsfehler und kann zu Sicherheitsmängeln führen. Die System.Uri-Klasse stellt diese Dienste auf sichere Weise bereit.
CA1056: URI-Eigenschaften dürfen keine Zeichenfolgen sein. Diese Regel geht davon aus, dass die Eigenschaft einen URI (Uniform Resource Identifier) darstellt. Eine Zeichenfolgendarstellung eines URIs ist anfällig für Analyse- und Codierungsfehler und kann zu Sicherheitsmängeln führen. Die System.Uri-Klasse stellt diese Dienste auf sichere Weise bereit.
CA1058: Typen sollten bestimmte Basistypen nicht erweitern. Ein extern sichtbarer Typ erweitert bestimmte Basistypen. Verwenden Sie eine der Alternativen.
CA1060: P-Invokes in NativeMethods-Klasse verschieben Plattformaufrufmethoden, beispielsweise Methoden, die mit dem Attribut „System.Runtime.InteropServices.DllImportAttribute“ gekennzeichnet sind, oder Methoden, die in Visual Basic anhand des Schlüsselworts Declare definiert wurden, greifen auf nicht verwalteten Code zu. Diese Methoden sollten der Klasse NativeMethods, SafeNativeMethods oder UnsafeNativeMethods angehören.
CA1061: Basisklassenmethoden nicht ausblenden. Eine Methode in einem Basistyp wird durch eine Methode mit identischem Namen in einem abgeleiteten Typ verdeckt, wenn die Parametersignatur der abgeleiteten Methode sich nur hinsichtlich der Typen unterscheidet, die schwächer abgeleitet sind als die entsprechenden Typen in der Parametersignatur der Basismethode.
CA1062: Argumente von öffentlichen Methoden validieren. Alle an extern sichtbare Methoden übergebenen Verweisargumente sollten auf NULL überprüft werden.
CA1063: IDisposable korrekt implementieren. Alle IDisposable-Typen müssen das Dispose-Muster korrekt implementieren.
CA1064: Ausnahmen sollten öffentlich sein. Eine interne Ausnahme ist nur innerhalb ihres eigenen internen Bereichs sichtbar. Nachdem die Ausnahme den internen Bereich verlassen hat, kann nur die Basisausnahme zum Abfangen der Ausnahme verwendet werden. Wenn die interne Ausnahme von Exception, SystemException, oder ApplicationException geerbt wurde, verfügt der externe Code nicht über genügend Informationen zur Behandlung der Ausnahme.
CA1065: Keine Ausnahmen an unerwarteten Speicherorten auslösen. Eine Methode, von der das Auslösen von Ausnahmen nicht erwartet wird, löst eine Ausnahme aus.
CA1066: „IEquatable“ beim Außerkraftsetzen von „Equals“ implementieren Ein Wertetyp überschreibt eine Equals-Methode, implementiert aber nicht IEquatable<T>.
CA1067: „Object.Equals(object)“ bei Implementierung von „IEquatable“ außer Kraft setzen Ein Typ implementiert IEquatable<T>, setzt aber die Methode Equals nicht außer Kraft.
CA1068: CancellationToken-Parameter müssen zuletzt aufgeführt werden. Eine Methode verfügt über einen CancellationToken-Parameter, der nicht der letzte Parameter ist.
CA1069: Enumerationen dürfen keine doppelten Werte aufweisen. Eine Enumeration verfügt über mehrere Member, denen explizit derselbe Konstantwert zugewiesen wird.
CA1070: Ereignisfelder dürfen nicht als virtuell deklariert werden. Ein einem Feld ähnliches Ereignis wurde als virtuell deklariert.
CA1200: Verwenden Sie keine cref-Tags mit einem Präfix. Das Attribut cref in einem XML-Dokumentationstag steht für „Code reference“ (Codeverweis). Es gibt an, dass der innere Text des Tags ein Codeelement ist, wie z.B. ein Typ, eine Methode oder Eigenschaft. Verwenden Sie keine cref-Tags mit Präfixen, da diese verhindern, dass der Compiler Referenzen überprüfen kann. Außerdem wird dadurch verhindert, dass die integrierte Entwicklungsumgebung (IDE) von Visual Studio diese Symbolverweise beim Refactoring findet und aktualisiert.
CA1303: Literale nicht als lokalisierte Parameter übergeben. Eine extern sichtbare Methode übergibt ein Zeichenfolgenliteral als Parameter an einen .NET-Konstruktor oder eine Methode, und diese Zeichenfolge sollte lokalisierbar sein.
CA1304: CultureInfo angeben. Eine Methode oder ein Konstruktor ruft einen Member mit einer Überladung auf, die einen System.Globalization.CultureInfo-Parameter akzeptiert. Die Methode oder der Konstruktor ruft nicht die Überladung auf, die den CultureInfo-Parameter akzeptiert. Wenn ein CultureInfo-Objekt oder ein System.IFormatProvider-Objekt nicht angegeben wird, besitzt der vom überladenen Member bereitgestellte Standardwert möglicherweise nicht in allen Gebietsschemas den gewünschten Effekt.
CA1305: IFormatProvider angeben. Eine Methode oder ein Konstruktor ruft einen oder mehrere Member auf, die Überladungen besitzen und einen System.IFormatProvider-Parameter akzeptieren; die Methode oder der Konstruktor ruft die Überladung nicht auf, die den IFormatProvider-Parameter akzeptiert. Wenn ein System.Globalization.CultureInfo-Objekt oder ein IFormatProvider-Objekt nicht angegeben wird, besitzt der vom überladenen Member bereitgestellte Standardwert möglicherweise nicht in allen Gebietsschemas den gewünschten Effekt.
CA1307: "StringComparison" zur Verdeutlichung angeben Ein Zeichenfolgenvergleich verwendet eine Methodenüberladung, durch die kein StringComparison-Parameter festgelegt wird.
CA1308: Zeichenfolgen in Großbuchstaben normalisieren. Zeichenfolgen sollten in Großschreibung normalisiert werden. Für eine kleine Gruppe von Zeichen wird bei der Konvertierung in Kleinbuchstaben kein Roundtrip ausgeführt.
CA1309: Ordinal-StringComparison verwenden. Durch einen nicht linguistischen Zeichenfolgenvergleich wird der StringComparison-Parameter nicht auf Ordinal und nicht auf OrdinalIgnoreCase festgelegt. Wenn der Parameter explizit auf StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase festgelegt wird, werden die Codeausführung beschleunigt sowie Richtigkeit und Zuverlässigkeit gesteigert.
CA1310: "StringComparison" für Richtigkeit angeben Ein Zeichenfolgenvergleichsvorgang verwendet eine Methodenüberladung, die keinen StringComparison-Parameter festgelegt und standardmäßig einen kulturspezifischen Zeichenfolgenvergleich verwendet.
CA1311: Geben Sie eine Kultur an oder verwenden Sie eine invariante Version Geben Sie eine Kultur an, oder verwenden Sie eine invariante Kultur, um beim Aufrufen von ToUpper oder ToLower implizite Abhängigkeiten von der aktuellen Kultur zu vermeiden.
CA1401: P-Invokes dürfen nicht sichtbar sein Eine öffentliche oder geschützte Methode in einem öffentlichen Typ enthält das Attribut System.Runtime.InteropServices.DllImportAttribute (in Visual Basic auch durch das Declare-Schlüsselwort implementiert). Solche Methoden sollten nicht verfügbar gemacht werden.
CA1416: Plattformkompatibilität überprüfen Durch die Verwendung von plattformabhängigen APIs für eine Komponente funktioniert der Code nicht mehr auf allen Plattformen.
CA1417: OutAttribute nicht für Zeichenfolgenparameter für P/Invokes verwenden Zeichenfolgenparameter, die als Wert mit OutAttribute übergeben werden, können die Runtime destabilisieren, wenn die Zeichenfolge internalisiert ist.
CA1418: Gültige Plattformzeichenfolge verwenden Das Analyseprogramm für die Plattformkompatibilität erfordert einen gültigen Plattformnamen und eine gültige Version.
CA1419: Für konkrete Typen, die von „System.Runtime.InteropServices.SafeHandle“ abgeleitet werden, einen parameterlosen Konstruktor bereitstellen, der die gleiche Sichtbarkeit wie der enthaltende Typ aufweist Indem Sie für einen von System.Runtime.InteropServices.SafeHandle abgeleiteten Typ einen parameterlosen Konstruktor bereitstellen, der die gleiche Sichtbarkeit wie der enthaltende Typ aufweist, erzielen Sie eine bessere Leistung und optimieren die Nutzung mit aus der Quelle generierten Interoplösungen.
CA1420: Eigenschaft, Typ oder Attribut erfordert Runtime-Marshalling. Die Verwendung von Features, die Runtime-Marshalling erfordern, wenn das Runtime-Marshalling deaktiviert ist, führt zu Laufzeitausnahmen.
CA1421: Methode verwendet Runtimemarshalling, wenn „DisableRuntimeMarshallingAttribute“ angewendet wird Eine Methode verwendet das Runtimemarshalling, obwohl dieses explizit deaktiviert ist.
CA1422: Überprüfen der Plattformkompatibilität Das Aufrufen einer API, die in einem bestimmten Betriebssystem (Version) veraltet ist, von einer Aufrufsite aus, die von diesem Betriebssystem (Version) aus erreichbar ist, wird nicht empfohlen.
CA1501: Übermäßige Vererbung vermeiden. Ein Typ ist in seiner Vererbungshierarchie mehr als vier Ebenen tief. Tief verschachtelte Typenhierarchien können schwer zu verfolgen, verstehen und verwalten sein.
CA1502: Übermäßige Komplexität vermeiden. Diese Regel ermöglicht Aussagen über die Anzahl linear unabhängiger Pfade in einer Methode, wobei die Anzahl der Pfade durch die Anzahl und Komplexität bedingter Branches bestimmt wird.
CA1505: Nicht wartbaren Code vermeiden. Ein Typ oder eine Methode verfügt über einen niedrigen Wartbarkeitsindexwert. Ein niedriger Wartbarkeitsindex zeigt an, dass ein Typ oder eine Methode wahrscheinlich schwer zu verwalten ist und geeignet für einen Neuentwurf wäre.
CA1506: Übermäßige Klassenkopplungen vermeiden. Durch diese Regel wird die Klassenkopplung gemessen, indem die eindeutigen Typverweise, die ein Typ oder eine Methode enthält, gezählt werden.
CA1507: „nameof“ anstelle der Zeichenfolge verwenden Ein Zeichenfolgenliteral wird als Argument verwendet, obwohl ein nameof-Ausdruck verwendet werden kann.
CA1508: Toten Bedingungscode vermeiden Eine Methode verfügt über einen Bedingungscode, der immer true oder false bei der Runtime ergibt. Dies führt zu einem toten Code im false-Branch der Bedingung.
CA1509: Ungültiger Eintrag in der Konfigurationsdatei für die Codemetrik. Codemetrikregeln wie CA1501, CA1502, CA1505 und CA1506 haben eine Konfigurationsdatei mit dem Namen CodeMetricsConfig.txt und einem ungültigen Eintrag bereitgestellt.
CA1510: Verwenden Sie ArgumentNullException throw-Hilfsprogramm Throw-Hilfsprogramme sind einfacher und effizienter als if-Blöcke, die eine neue Ausnahmeinstanz erstellen.
CA1511: Verwenden Sie ArgumentException throw-Hilfsprogramm Throw-Hilfsprogramme sind einfacher und effizienter als if-Blöcke, die eine neue Ausnahmeinstanz erstellen.
CA1512: Verwenden Sie ArgumentOutOfRangeException throw-Hilfsprogramm Throw-Hilfsprogramme sind einfacher und effizienter als if-Blöcke, die eine neue Ausnahmeinstanz erstellen.
CA1513: Verwenden Sie ObjectDisposedException throw-Hilfsprogramm Throw-Hilfsprogramme sind einfacher und effizienter als if-Blöcke, die eine neue Ausnahmeinstanz erstellen.
CA1514: Vermeiden des redundanten Längenarguments Ein redundantes Längenargument wird bei der Segmentierung bis zum Ende einer Zeichenfolge oder eines Puffers verwendet. Eine berechnete Länge kann fehleranfällig sein und ist außerdem unnötig.
CA1515: Erwägen Sie, öffentliche Typen intern zu machen Im Gegensatz zu einer Klassenbibliothek wird in der Regel nicht öffentlich auf die API einer Anwendung verwiesen, sodass Typen intern gekennzeichnet werden können.
CA1700: Enumerationswerte nicht mit "Reserviert" benennen. Bei dieser Regel wird vorausgesetzt, dass Enumerationsmember mit einem Namen, der "reserved" enthält, derzeit nicht verwendet werden, sondern Platzhalter sind, die in einer künftigen Version umbenannt oder entfernt werden sollen. Das Umbenennen oder Entfernen eines Members ist eine unterbrechende Änderung.
CA1707: Bezeichner sollten keine Unterstriche enthalten. Bezeichnernamen dürfen keinen Unterstrich (_) enthalten. Namespaces, Typen, Member und Parameter werden von dieser Regel überprüft.
CA1708: Bezeichner sollten sich nicht nur durch die Groß-/Kleinschreibung unterscheiden. Bezeichner für Namespaces, Typen, Member und Parameter dürfen sich nicht nur durch die Groß-/Kleinschreibung unterscheiden, weil Sprachen, die auf die Common Language Runtime abzielen, nicht zwischen Groß- und Kleinschreibung unterscheiden müssen.
CA1710: Bezeichner sollten ein richtiges Suffix aufweisen. Die Namen von Typen, die bestimmte Basistypen erweitern oder bestimmte Schnittstellen implementieren, bzw. von diesen Typen abgeleitete Typen weisen stets ein Suffix auf, das mit dem Basistyp oder der Schnittstelle verknüpft ist.
CA1711: Bezeichner sollten kein falsches Suffix aufweisen. Nur die Namen von Typen, die bestimmte Basistypen erweitern oder bestimmte Schnittstellen bzw. Typen implementieren, die von diesen Typen abgeleitet werden, sollten stets mit bestimmten reservierten Suffixen enden. Für andere Typnamen sollten diese reservierten Suffixe nicht verwendet werden.
CA1712: Keine Typnamen als Präfixe für Enumerationswerte verwenden. Den Namen von Enumerationsmembern wird der Typname nicht als Präfix vorangestellt, da die Typinformationen von den Entwicklungswerkzeugen bereitgestellt werden sollten.
CA1713: Ereignisse sollten kein Before- oder After-Präfix aufweisen. Der Name eines Ereignisses beginnt mit "Before" oder "After". Um verwandte Ereignisse zu benennen, die in einer bestimmten Reihenfolge ausgelöst werden, verwenden Sie die Gegenwarts- oder Vergangenheitsform, um ihre relative Position in der Aktionsfolge anzugeben.
CA1714: Flags-Enumerationen sollten Pluralnamen aufweisen. Eine öffentliche Enumeration verfügt über das System.FlagsAttribute-Attribut, und der Name endet nicht in der Pluralform ("s"). Die Namen von mit FlagsAttribute markierten Typen stehen im Plural, da das Attribut angibt, dass mehr als ein Wert festgelegt werden kann.
CA1715: Bezeichner sollten ein korrektes Präfix aufweisen. Der Name einer extern sichtbaren Schnittstelle beginnt nicht mit einem großen "I". Der Name eines generischen Typparameters für einen extern sichtbaren Typ oder eine extern sichtbare Methode beginnt nicht mit einem großen "T".
CA1716: Bezeichner sollten nicht mit Schlüsselwörtern übereinstimmen. Ein Namespacename oder ein Typname stimmt mit einem reservierten Schlüsselwort in einer Programmiersprache überein. Bezeichner für Namespaces und Typen dürfen nicht mit Schlüsselwörtern übereinstimmen, die in Programmiersprachen für die Common Language Runtime definiert sind.
CA1717: Nur FlagsAttribute-Enumerationen sollten Pluralnamen aufweisen. Gemäß den Benennungskonventionen gibt ein Pluralname für eine Enumeration an, dass für die Enumeration mehrere Werte gleichzeitig angegeben werden können.
CA1720: Bezeichner dürfen keine Typnamen enthalten. Der Name eines Parameters in einem extern sichtbaren Member enthält einen Datentypnamen, oder der Name eines extern sichtbaren Members enthält einen sprachspezifischen Datentypnamen.
CA1721: Eigenschaftennamen sollten nicht mit Get-Methoden übereinstimmen. Der Name eines öffentlichen oder geschützten Members beginnt mit "Get" und stimmt in anderer Hinsicht mit dem Namen einer öffentlichen oder geschützten Eigenschaft überein. "Get"-Methoden und -Eigenschaften sollten Namen aufweisen, die ihre Funktionen deutlich erkennbar machen.
CA1724: Typnamen sollten nicht mit Namespaces übereinstimmen. Typnamen sollten nicht mit .NET-Namespaces übereinstimmen. Durch einen Verstoß gegen diese Regel kann die Verwendbarkeit der Bibliothek eingeschränkt werden.
CA1725: Parameternamen sollten mit der Basisdeklaration übereinstimmen. Die konsistente Benennung von Parametern in einer Überschreibungshierarchie erhöht die Verwendbarkeit von Methodenüberschreibungen. Ein Parametername in einer abgeleiteten Methode, der vom Namen in der Basisdeklaration abweicht, kann zu Unklarheiten dahingehend führen, ob es sich bei der Methode um eine Überschreibung der Basismethode oder eine neue Überladung der Methode handelt.
CA1727: Verwenden von PascalCase für benannte Platzhalter Verwenden Sie PascalCase für benannte Platzhalter in der Vorlage für Protokollierungsnachrichten.
CA1801: Nicht verwendete Parameter überprüfen. Eine Methodensignatur enthält einen Parameter, der nicht im Methodentext verwendet wird.
CA1802: Nach Möglichkeit Literale verwenden. Ein Feld wird als statisch und schreibgeschützt deklariert (Shared und ReadOnly in Visual Basic) und mithilfe eines Werts initialisiert, der zur Kompilierzeit berechnet werden kann. Da der dem verwendeten Feld zugewiesene Wert zur Kompilierzeit berechnet werden kann, ändern Sie die Deklaration in ein const-Feld (Const in Visual Basic), sodass der Wert statt zur Runtime zur Kompilierzeit berechnet wird.
CA1805: Keine unnötige Initialisierung Die .NET-Runtime initialisiert alle Felder von Verweistypen mit ihren Standardwerten, bevor der Konstruktor ausgeführt wird. In den meisten Fällen ist die explizite Initialisierung eines Felds auf seinen Standardwert redundant, was zu Wartungskosten und möglicherweise zu leistungseinbußen kommt (z. B. mit erhöhter Montagegröße).
CA1806: Methodenergebnisse nicht ignorieren. Ein neues Objekt wird erstellt, aber nie verwendet, oder eine Methode wird aufgerufen, die eine neue Zeichenfolge erstellt und zurückgibt, die nie verwendet wird, oder eine COM-Methode oder P/Invoke-Methode gibt ein HRESULT oder einen Fehlercode zurück, das oder der nie verwendet wird.
CA1810: Statische Felder von Referenztypen inline initialisieren. Wenn ein Typ einen expliziten statischen Konstruktor deklariert, überprüft der JIT-Compiler (Just in Time) jede statische Methode und jeden Instanzenkonstruktor des Typs. Dadurch wird sichergestellt, dass der statische Konstruktor zuvor aufgerufen wurde. Durch die Überprüfung statischer Konstruktoren kann die Leistung herabgesetzt werden.
CA1812: Nicht instanziierte interne Klassen vermeiden. Eine Instanz eines Typs auf Assemblyebene wird nicht durch Code in der Assembly erstellt.
CA1813: Nicht versiegelte Attribute vermeiden. .NET stellt Methoden zum Abrufen benutzerdefinierter Attribute bereit. Standardmäßig wird mit diesen Methoden die Attributvererbungshierarchie durchsucht. Durch Verwendung eines versiegelten Attributs wird das Durchsuchen der Vererbungshierarchie unterbunden und die Leistung u. U. verbessert.
CA1814: Jagged Arrays mehrdimensionalen Arrays vorziehen. Ein verzweigtes Array ist ein Array, dessen Elemente wiederum Arrays sind. Die Arrays, die die Elemente bilden, können unterschiedliche Größen haben, was bei einigen Gruppen von Daten dazu führt, dass weniger Speicherplatz vergeudet wird.
CA1815: Equals und Gleichheitsoperator für Werttypen überschreiben. Bei Werttypen wird die Reflection-Bibliothek von der geerbten Implementierung von Equals verwendet und der Inhalt aller Felder verglichen. Reflection ist rechenintensiv, und das Überprüfen eines jeden Felds auf Gleichheit ist eventuell unnötig. Wenn Sie erwarten, dass die Benutzer Instanzen vergleichen oder sortieren bzw. dass sie die Instanzen als Schlüssel für Hashtabellen verwenden, sollte der Werttyp Equals implementieren.
CA1816: GC.SuppressFinalize korrekt aufrufen. Eine Methode, die eine Implementierung von Dispose bildet, ruft nicht GC.SuppressFinalize auf, oder eine Methode, die keine Implementierung von Dispose bildet, ruft GC.SuppressFinalize auf, oder eine Methode ruft GC.SuppressFinalize auf und übergibt ein anderes Element als dieses (Me in Visual Basic).
CA1819: Eigenschaften sollten keine Arrays zurückgeben. Von Eigenschaften zurückgegebene Arrays sind nicht schreibgeschützt, auch wenn die Eigenschaft schreibgeschützt ist. Damit das Array gegen Manipulationen geschützt bleibt, muss die Eigenschaft eine Kopie des Arrays zurückgeben. Normalerweise verstehen die Benutzer nicht, welche negativen Auswirkungen der Aufruf einer solchen Eigenschaft auf die Leistung hat.
CA1820: Mithilfe der Zeichenfolgenlänge auf leere Zeichenfolgen prüfen. Der Vergleich von Zeichenfolgen mit der String.Length-Eigenschaft oder der String.IsNullOrEmpty-Methode führt erheblich schneller zu Ergebnissen als das Verwenden von Equals.
CA1821: Leere Finalizer entfernen. Finalizer sollten möglichst vermieden werden, da durch Verfolgung der Objektlebensdauer zusätzliche Leistung beansprucht wird. Ein leerer Finalizer verursacht zusätzlichen Mehraufwand ohne Nutzen.
CA1822: Member als statisch markieren. Member, die nicht auf Instanzdaten zugreifen oder keine Instanzmethoden aufrufen, können als statisch markiert werden (Shared in Visual Basic). Danach gibt der Compiler nicht virtuelle Aufrufsites an diese Member aus. Dies kann zu einer messbaren Leistungssteigerung für leistungsabhängigen Code führen.
CA1823: Nicht verwendete private Felder vermeiden. Es wurden private Felder erkannt, auf die in der Assembly anscheinend kein Zugriff erfolgt.
CA1824: Assemblys mit NeutralResourcesLanguageAttribute markieren. Mit dem Attribut „NeutralResourcesLanguage“ wird dem Resource Manager die Sprache mitgeteilt, in der die Ressourcen einer neutralen Kultur für eine Assembly angezeigt wurden. Auf diese Weise wird die Suchleistung für die erste zu ladende Ressource verbessert und Ihr Workingset kann sich verkleinern.
CA1825: Vermeiden Sie Arrayzuteilungen mit einer Länge von 0 (null). Die Initialisierung eines Arrays der Länge 0 (null) führt zu einer unnötigen Arbeitsspeicherbelegung. Verwenden Sie stattdessen die statisch zugeordnete leere Array Instanz, indem Sie Array.Empty aufrufen. Die Arbeitsspeicherbelegung wird für alle Aufrufe dieser Methode freigegeben.
CA1826: Eigenschaft anstelle der LINQ-Enumerable-Methode verwenden. Die Enumerable LINQ-Methode wurde für einen Typ verwendet, der eine äquivalente, effizientere Eigenschaft unterstützt.
CA1827: Count/LongCount nicht verwenden, wenn Any verwendet werden kann. Die Methode Count oder LongCount wurde verwendet, obwohl die Methode Any effizienter gewesen wäre.
CA1828: CountAsync/LongCountAsync nicht verwenden, wenn AnyAsync verwendet werden kann. Die Methode CountAsync oder LongCountAsync wurde verwendet, obwohl die Methode AnyAsync effizienter gewesen wäre.
CA1829: Length/Count-Eigenschaft anstelle der Enumerable.Count-Methode verwenden. Die Count LINQ-Methode wurde für einen Typ verwendet, der eine äquivalente, effizientere Eigenschaft Length oder Count unterstützt.
CA1830: Bevorzugen Sie stark typisierte Append- und Insert-Methodenüberladungen für StringBuilder. Append und Insert stellen Überladungen für mehrere Typen über String hinaus bereit. Bevorzugen Sie nach Möglichkeit die stark typisierten Überladungen anstatt der Verwendung von ToString() und der auf Zeichenfolgen basierten Überladung.
CA1831: Verwenden Sie für Zeichenfolgen bei Bedarf anstelle von Range-basierten Indexern „AsSpan“. Wenn Sie einen Bereichsindexer für eine Zeichenfolge verwenden und den Wert implizit dem ReadOnlySpan<char>-Typ zuweisen, wird die Methode Substring anstelle von Slice verwendet, wodurch eine Kopie des angeforderten Teils der Zeichenfolge erzeugt wird.
CA1832: Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines ReadOnlySpan- oder ReadOnlyMemory-Teils eines Arrays. Wenn Sie einen Bereichsindexer für ein Array verwenden und den Wert implizit einem Typ ReadOnlySpan<T> oder ReadOnlyMemory<T> zuweisen, wird die Methode GetSubArray anstelle von Slice verwendet, wodurch eine Kopie des angeforderten Teils des Arrays erzeugt wird.
CA1833: Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines Span- oder Memory-Teils eines Arrays. Wenn Sie einen Bereichsindexer für ein Array verwenden und den Wert implizit einem Typ Span<T> oder Memory<T> zuweisen, wird die Methode GetSubArray anstelle von Slice verwendet, wodurch eine Kopie des angeforderten Teils des Arrays erzeugt wird.
CA1834: Verwenden von StringBuilder.Append(char) für Zeichenfolgen mit einem einzelnen Zeichen StringBuilder verfügt über eine Append-Überladung, die char als Argument annimmt. Bevorzugen Sie aus Leistungsgründen das Aufrufen der char-Überladung.
CA1835: Für „ReadAsync“ und „WriteAsync“ auf „Memory“ basierende Überladungen bevorzugen „Stream“ verfügt über eine „ReadAsync“-Überladung, die „Memory<Byte>“ als erstes Argument annimmt, und eine „WriteAsync“-Überladung, die „ReadOnlyMemory<Byte>“ als erstes Argument annimmt. Bevorzugen Sie das Aufrufen der auf Memory basierenden Überladungen, die effizienter sind.
CA1836: IsEmpty vor Count bevorzugen, wenn verfügbar Bevorzugen Sie die IsEmpty-Eigenschaft, die effizienter ist als Count, Length, Count<TSource>(IEnumerable<TSource>) oder LongCount<TSource>(IEnumerable<TSource>), um zu bestimmen, ob ein Objekt Elemente enthält.
CA1837: Environment.ProcessId anstelle von Process.GetCurrentProcess().Id verwenden Environment.ProcessId ist einfacher und schneller als Process.GetCurrentProcess().Id.
CA1838: StringBuilder-Parameter für P/Invokes vermeiden Beim Marshalling von „StringBuilder“ wird immer eine native Pufferkopie erstellt, sodass mehrere Zuordnungen für einen Marshallingvorgang vorhanden sind.
CA1839: Verwenden von „Environment.ProcessPath“ anstelle von „Process.GetCurrentProcess().MainModule.FileName“ Environment.ProcessPath ist einfacher und schneller als Process.GetCurrentProcess().MainModule.FileName.
CA1840: Verwenden von „Environment.CurrentManagedThreadId“ anstelle von „Thread.CurrentThread.ManagedThreadId“ Environment.CurrentManagedThreadId ist kompakter und effizienter als Thread.CurrentThread.ManagedThreadId.
CA1841: Dictionary Contains-Methoden bevorzugen Das Aufrufen Contains der Keys Oder Values Sammlung kann häufig teurer sein als das Aufrufen ContainsKey oder ContainsValue Aufrufen des Wörterbuchs selbst.
CA1842: Verwenden Sie „WhenAll“ nicht mit einer einzelnen Aufgabe Die Verwendung WhenAll mit einem einzelnen Vorgang kann zu Leistungsverlusten führen. Verwenden Sie stattdessen „await“, oder geben Sie die Aufgabe zurück.
CA1843: Verwenden Sie „WaitAll“ nicht mit einer einzelnen Aufgabe Die Verwendung WaitAll mit einem einzelnen Vorgang kann zu Leistungsverlusten führen. Verwenden Sie stattdessen „await“, oder geben Sie die Aufgabe zurück.
CA1844: Arbeitsspeicherbasierte asynchrone Methoden beim Erstellen von Unterklassen von 'Stream' außer Kraft setzen Um die Leistung zu verbessern, setzen Sie die arbeitsspeicherbasierten asynchronen Methoden beim Erstellen von Unterklassen von 'Stream' außer Kraft. Implementieren Sie dann die arraybasierten Methoden anstelle der arbeitsspeicherbasierten Methoden.
CA1845: „string.Concat“ auf Span-Basis verwenden Es ist effizienter, AsSpan und string.Concat anstelle von Substring und einem Verkettungsoperator zu verwenden.
CA1846: Bevorzugt AsSpan gegenüber Substring AsSpan ist effizienter als Substring. Substring führt eine O(n)-Zeichenfolgenkopie aus, während AsSpan das nicht tut und konstante Kosten aufweist. AsSpan führt auch keine Heapzuordnungen aus.
CA1847: Zeichenliteral für Einzelzeichensuche verwenden Verwenden Sie bei der Suche nach einem einzelnen Zeichen String.Contains(char) anstelle von String.Contains(string).
CA1848: Verwenden der LoggerMessage-Delegaten Um die Leistung zu verbessern, verwenden Sie die LoggerMessage-Delegaten.
CA1849: Asynchrone Methoden in einer asynchronen Methode aufrufen Bei einer Methode, die bereits asynchron ist, sollten Aufrufe anderer Methoden an ihre asynchronen Versionen erfolgen, sofern sie vorhanden sind.
CA1850: Statische HashData-Methode gegenüber ComputeHash bevorzugen Es ist effizienter, die statische HashData-Methode zu verwenden, statt eine HashAlgorithm-Instanz zum Aufrufen von ComputeHash zu erstellen und zu verwalten.
CA1851: Mögliche mehrere Enumerationen der „IEnumerable“-Auflistung Mögliche mehrere Enumerationen der IEnumerable-Auflistung Erwägen Sie eine Implementierung, die mehrere Enumerationen vermeidet.
CA1852: Versiegeln interner Typen Ein Typ, auf den außerhalb der Assembly nicht zugegriffen werden kann und der keine Untertypen innerhalb der enthaltenden Assembly enthält, ist nicht versiegelt.
CA1853: Nicht erforderlicher Aufruf von Dictionary.ContainsKey(key) Es ist nicht erforderlich, Dictionary.Remove(key) mit Dictionary.ContainsKey(key) zu schützen. Dictionary<TKey,TValue>.Remove(TKey) überprüft bereits, ob der Schlüssel vorhanden ist und wird nicht ausgelöst, wenn er nicht vorhanden ist.
CA1854: Bevorzugen der Methode IDictionary.TryGetValue(TKey, out TValue) Bevorzugen Sie TryGetValue gegenüber einem Zugriff auf einen Dictionary-Indexer, der durch eine ContainsKey-Überprüfung geschützt wird. ContainsKey und der Indexer schlagen beide den Schlüssel nach, sodass bei Verwendung von TryGetValue der zusätzliche Lookup vemieden wird.
CA1855: Verwenden von Span<T>.Clear() anstelle von Span<T>.Fill() Es ist effizienter, Span<T>.Clear() statt Span<T>.Fill(T) aufzurufen, um die Elemente des „span“-Elements mit einem Standardwert aufzufüllen.
CA1856: Falsche Verwendung des ConstantExpected-Attributs Das ConstantExpectedAttribute-Attribut wird nicht korrekt auf einen Parameter angewendet.
CA1857: Der Parameter erwartet eine Konstante für optimale Leistung Ein ungültiges Argument wird an einen Parameter übergeben, der mit ConstantExpectedAttribute-Anmerkungen versehen ist.
CA1858: Verwenden von StartsWith anstelle von IndexOf Es ist effizienter, String.StartsWith statt String.IndexOf aufzurufen, um zu prüfen, ob eine Zeichenfolge mit einem bestimmten Präfix beginnt.
CA1859: Verwenden Sie nach Möglichkeit konkrete Typen, um die Leistung zu verbessern Der Code verwendet Schnittstellentypen oder abstrakte Typen, die zu unnötigen Schnittstellenaufrufen oder virtuellen Aufrufen führen.
CA1860: Vermeiden der Verwendung der Erweiterungsmethode „Enumerable.Any()“ Die Verwendung von Length, Count oder IsEmpty (falls möglich) ist effizienter und übersichtlicher als der Aufruf von Enumerable.Any, um zu ermitteln, ob ein Sammlungstyp über Elemente verfügt.
CA1861: Vermeiden von konstanten Arrays als Argumente Konstantenarrays, die als Argumente übergeben werden, werden nicht wiederverwendet. Dies führt zu einem Leistungsmehraufwand. Erwägen Sie, sie in statische schreibgeschützte Felder (static readonly) zu extrahieren, um die Leistung zu verbessern.
CA1862: Verwenden der Überladungen der Methode „StringComparison“, um Vergleiche zwischen Zeichenfolgen ohne Berücksichtigung der Groß-/Kleinschreibung durchzuführen Wenn Code ToLower() oder ToUpper() aufruft, um einen Vergleich zwischen Zeichenfolgen ohne Groß-/Kleinschreibung durchzuführen, wird eine unnötige Zuordnung vorgenommen.
CA1863: Verwenden von „CompositeFormat“ Um die Formatierungskosten zu reduzieren, speichern Sie eine CompositeFormat-Instanz zwischen und verwenden sie als Argument für String.Format oder StringBuilder.AppendFormat.
CA1864: Bevorzugt die Methode „IDictionary.TryAdd(TKey, TValue)“ Sowohl Dictionary<TKey,TValue>.ContainsKey(TKey) als auch Dictionary<TKey,TValue>.Add führen ein redundantes Lookup durch. Es ist effizienter, Dictionary<TKey,TValue>.TryAdd aufzurufen, wodurch ein bool-Element zurückgegeben wird, das angibt, ob der Wert hinzugefügt wurde oder nicht. TryAdd überschreibt den Wert des Schlüssels nicht, wenn der Schlüssel bereits vorhanden ist.
CA1865-CA1867: Verwenden von Zeichenüberladung Die Zeichenüberladung ist eine Überladung mit höherer Leistung für eine Zeichenfolge mit einem einzelnen Zeichen.
CA1868: Unnötiger Aufruf von „Contains“ für Sets Sowohl ISet<T>.Add(T) wie auch ICollection<T>.Remove(T) führen ein Lookup durch, der es überflüssig macht, vorher ICollection<T>.Contains(T) aufzurufen. Es ist effizienter, Add(T) oder Remove(T) direkt aufzurufen, wodurch ein boolescher Wert zurückgegeben wird, der angibt, ob das Element hinzugefügt oder entfernt wurde.
CA1869: Zwischenspeichern und Wiederverwenden von „JsonSerializerOptions“-Instanzen Die Verwendung einer lokalen Instanz von JsonSerializerOptions für die Serialisierung oder Deserialisierung kann die Leistung Ihrer Anwendung erheblich beeinträchtigen, wenn Ihr Code mehrmals ausgeführt wird, da System.Text.Json serialisierungsbezogene Metadaten intern in der bereitgestellten Instanz zwischenspeichert.
CA1870: Verwenden einer zwischengespeicherten „SearchValues“-Instanz Die Verwendung einer zwischengespeicherten SearchValues<T>-Instanz ist effizienter als das direkte Übergeben von Werten an „IndexOfAny“ oder „ContainsAny“.
CA1871: Übergeben Sie keine nullable Struktur an 'ArgumentNullException.ThrowIfNull' 'ArgumentNullException.ThrowIfNull' akzeptiert ein 'Objekt', sodass das Übergeben einer nullablen Struktur dazu führen kann, dass der Wert boxt wird.
CA1872: 'Convert.ToHexString' und 'Convert.ToHexStringLower' zu Aufrufketten basierend auf 'BitConverter.ToString' bevorzugen Verwenden Oder Convert.ToHexString Convert.ToHexStringLower wenn Bytes in eine Hexadezimalzeichenfolgendarstellung codiert werden. Diese Methoden sind effizienter und zuordnungsfreundlicher als die Verwendung BitConverter.ToString in Kombination mit String.Replace Strichen und String.ToLowerBindestrichen.
CA2000: Objekte verwerfen, bevor Bereich verloren geht. Da eine Ausnahme auftreten kann, durch die die Ausführung eines Objektfinalizers verhindert wird, sollte das Objekt explizit verworfen werden, bevor sich sämtliche Verweise auf dieses außerhalb des Bereichs befinden.
CA2002: Auf Objekten mit schwacher Identität nicht sperren. Ein Objekt hat eine schwache Identität, wenn ein Zugriff darauf über Grenzen von Anwendungsdomänen hinweg möglich ist. Ein Thread, der eine Sperre für ein Objekt zu erhalten versucht, das über eine schwache Identität verfügt, kann durch einen zweiten Thread in einer anderen Anwendungsdomäne blockiert werden, der eine Sperre für das gleiche Objekt besitzt.
CA2007: Eine Aufgabe nicht direkt abwarten Eine asynchrone Methode wartet direkt auf eine Aufgabe (Task). Wenn eine asynchrone Methode direkt auf eine Aufgabe (Task) wartet, erfolgt die Fortsetzung innerhalb desselben Threads, in dem auch die Aufgabe erstellt wurde. Dieses Verhalten kann zu einer Leistungsbeeinträchtigung und einem Deadlock des Benutzeroberflächenthreads führen. Erwägen Sie, Task.ConfigureAwait(Boolean) aufzurufen, um Ihre Fortsetzungsabsicht zu signalisieren.
CA2008: Keine Tasks ohne Übergabe eines TaskSchedulers erstellen Eine Taskerstellung oder ein Fortsetzungsvorgang verwendet eine Methodenüberladung, die keinen TaskScheduler-Parameter angibt.
CA2009: „ToImmutableCollection“ nicht für einen ImmutableCollection-Wert aufrufen. Die ToImmutable-Methode wurde unnötigerweise für eine unveränderliche Sammlung aus dem System.Collections.Immutable-Namespace aufgerufen.
CA2011: Eigenschaft nicht innerhalb ihres Setters zuweisen Einer Eigenschaft wurde versehentlich ein Wert innerhalb ihrer eigenen set-Zugriffsmethode zugewiesen.
CA2012: Verwenden Sie ValueTasks ordnungsgemäß. ValueTasks, die von Memberaufrufen zurückgegeben werden, sollten direkt erwartet werden. Versuche, eine ValueTask mehrmals zu nutzen oder direkt auf das Ergebnis zuzugreifen, bevor bekannt ist, dass es abgeschlossen ist, kann zu einer Ausnahme oder Beschädigung führen. Das Ignorieren eines solchen ValueTask ist wahrscheinlich ein Hinweis auf einen funktionalen Fehler und kann die Leistung beeinträchtigen.
CA2013: Verwenden Sie ReferenceEquals nicht mit Werttypen. Wenn objA und objB beim Vergleichen von Werten mithilfe von System.Object.ReferenceEquals Werttypen sind, werden sie geschachtelt, bevor sie an die ReferenceEquals-Methode übergeben werden. Dies bedeutet, dass die ReferenceEquals-Methode selbst dann „false“ zurückgibt, wenn objA und objB dieselbe Instanz eines Werttyps darstellen.
CA2014: stackalloc nicht in Schleifen verwenden Der von einem stackalloc-Ausdruck zugewiesene Stapelspeicher wird nur am Ende des Aufrufs der aktuellen Methode freigegeben. Die Verwendung in einer Schleife kann zu einem unbegrenzten Stapelwachstum und letztlichen Stapelüberlauf führen.
CA2015: Keine Finalizer für von MemoryManager<T> abgeleitete Typen definieren Das Hinzufügen eines Finalizers zu einem abgeleiteten MemoryManager<T> Typ kann das Freigeben des Arbeitsspeichers ermöglichen, während er noch von einem Span<T>verwendet wird.
CA2016: Parameter "CancellationToken" an Methoden weiterleiten, die diesen Parameter akzeptieren. Leiten Sie den CancellationToken-Parameter an Methoden weiter, die diesen akzeptieren, um sicherzustellen, dass die Benachrichtigungen zum Abbruch des Vorgangs ordnungsgemäß weitergegeben werden. Alternativ dazu können Sie explizit CancellationToken.None übergeben, um festzulegen, dass das Token nicht verteilt werden soll.
CA2017: Konflikt bei der Parameteranzahl Die Anzahl der in der Vorlage für Protokollierungsnachrichten angegebenen Parameter stimmt nicht mit der Anzahl benannter Platzhalter überein.
CA2018: Das an Buffer.BlockCopy übergebene count-Argument sollte die Anzahl der zu kopierenden Bytes angeben Wenn Sie Buffer.BlockCopy verwenden, gibt das count-Argument die Anzahl der zu kopierenden Bytes an. Sie sollten Array.Length nur für das count-Argument in Arrays verwenden, deren Elemente genau ein Byte groß sind. byte-, sbyte- und bool-Arrays weisen Elemente auf, die ein Byte groß sind.
CA2019: ThreadStatic-Felder dürfen keine Inlineinitialisierung verwenden. Ein Feld, das mit einer ThreadStaticAttribute-Anmerkung versehen ist, wird inline oder explizit in einem static-Konstruktor (Shared in Visual Basic) initialisiert.
CA2020: Verhindern von Verhaltensänderungen durch integrierte Operatoren von IntPtr/UIntPtr Einige integrierte Operatoren, die in .NET 7 hinzugefügt wurden, verhalten sich anders als die benutzerdefinierten Operatoren in .NET 6 und früheren Versionen. Einige Operatoren, die normalerweise während des Überlaufs in ungeprüftem Kontext ausgelöst haben, lösen nicht mehr aus, es sei denn, sie werden in überprüften Kontext eingeschlossen. Einige Operatoren, die zuvor in überprüftem Kontext nicht ausgelöst haben, lösen jetzt aus, es sei denn, sie sind in nicht überprüften Kontext eingeschlossen.
CA2021: Rufen Sie Enumerable.Cast<T> oder Enumerable.OfType<T> nicht mit inkompatiblen Typen auf Ein Aufruf Enumerable.Cast<TResult>(IEnumerable) oder Enumerable.OfType<TResult>(IEnumerable) gibt einen Typparameter an, der nicht mit dem Typ der Eingabeauflistung kompatibel ist.
CA2022: Vermeiden von ungenauen Lesevorgängen mit Stream.Read Ein Aufruf, um Stream.Read weniger Bytes als angefordert zurückzugeben, was zu unzuverlässigem Code führt, wenn der Rückgabewert nicht überprüft wird.
CA2100: SQL-Abfragen auf Sicherheitsrisiken überprüfen. Eine Methode legt die System.Data.IDbCommand.CommandText-Eigenschaft mithilfe einer Zeichenfolge fest, die aus einem Zeichenfolgenargument für die Methode erstellt wird. Diese Regel setzt voraus, dass das Zeichenfolgenargument Benutzereingaben enthält. Eine aus Benutzereingaben erstellte SQL-Befehlszeichenfolge ist anfällig für SQL-Injection-Angriffe.
CA2101: Marshalling für „P/Invoke“-Zeichenfolgenargumente festlegen Ein Plattformaufrufmember lässt teilweise vertrauenswürdige Aufrufer zu, enthält einen Zeichenfolgenparameter und führt kein explizites Marshalling der Zeichenfolge durch. Auf diese Weise kann potenziell eine Sicherheitslücke verursacht werden.
CA2109: Sichtbare Ereignishandler überprüfen. Eine öffentliche oder geschützte Ereignisbehandlungsmethode wurde erkannt. Ereignisbehandlungsmethoden sollten nur dann verfügbar gemacht werden, wenn dies absolut notwendig ist.
CA2119: Methoden versiegeln, die die Bedingungen privater Schnittstellen erfüllen. Ein vererbbarer öffentlicher Typ stellt eine überschreibbare Methodenimplementierung einer internen Schnittstelle (Friend in Visual Basic) bereit. Um einen Verstoß gegen diese Regel zu beheben, verhindern Sie, dass die Methode außerhalb der Assembly überschrieben wird.
CA2153: Verarbeitung von Corrupted State Exceptions verhindern Corrupted State Exceptions (CSE) weisen auf eine Speicherbeschädigung innerhalb des Prozesses hin. Diese abzufangen, statt einen Absturz des Prozesses zuzulassen, führt zu Sicherheitsrisiken, falls ein Angreifer einen Exploit in den beschädigten Speicherbereich einschleusen kann.
CA2200: Erneut ausführen, um Stapeldetails beizubehalten. Eine Ausnahme wird erneut ausgelöst, und die Ausnahme wird in der throw-Anweisung explizit angegeben. Wenn eine Ausnahme durch Angeben der Ausnahme in der throw-Anweisung erneut ausgelöst wird, geht die Liste der Methoden, die zwischen der Methode, durch die die Ausnahme ursprünglich ausgelöst wurde, und der aktuellen Methode aufgerufen wurden, verloren.
CA2201: Keine reservierten Ausnahmetypen auslösen. Dadurch ist der ursprüngliche Fehler nur schwer zu erkennen und zu debuggen.
CA2207: Statische Felder für Werttyp inline initialisieren. Ein Werttyp deklariert einen expliziten statischen Konstruktor. Um einen Verstoß gegen diese Regel zu beheben, initialisieren Sie alle statischen Daten nach deren Deklaration und entfernen den statischen Konstruktor.
CA2208: Argumentausnahmen korrekt instanziieren. Es wird ein Aufruf an den Standardkonstruktor (parameterlose) eines Ausnahmetyps ausgeführt, der oder von ArgumentExceptiondem abgeleitet wird, oder ein falsches Zeichenfolgenargument an einen parametrisierten Konstruktor eines Ausnahmetyps übergeben wird, der oder von ArgumentExceptiondem abgeleitet wird.
CA2211: Nicht konstante Felder sollten nicht sichtbar sein. Statische Felder, die weder konstant noch schreibgeschützt sind, sind nicht threadsicher. Der Zugriff auf ein solches Feld muss sorgfältig kontrolliert werden und erfordert fortgeschrittene Programmiertechniken zur Synchronisierung des Zugriffs auf das Klassenobjekt.
CA2213: Verwerfbare Felder verwerfen. Ein Typ, der System.IDisposable implementiert, deklariert Felder von Typen, die ebenfalls IDisposable implementieren. Die Dispose-Methode des Felds wird nicht von der Dispose-Methode des deklarierenden Typs aufgerufen.
CA2214: Überschreibbare Methoden in Konstruktoren nicht aufrufen. Wenn ein Konstruktor eine virtuelle Methode aufruft, wurde der Konstruktor für die Instanz, die die Methode aufruft, möglicherweise nicht ausgeführt.
CA2215: Dispose-Methoden müssen die Dispose-Funktion der Basisklasse aufrufen. Wenn ein Typ von einem Typ erbt, der verworfen werden kann, muss von seiner Dispose-Methode die Dispose-Methode des Basistyps aufgerufen werden.
CA2216: Verwerfbare Typen sollten einen Finalizer deklarieren. Ein Typ, der System.IDisposable implementiert und Felder besitzt, bei denen die Verwendung nicht verwalteter Ressourcen empfohlen wird, implementiert keinen Finalizer wie von Object.Finalize beschrieben.
CA2217: Enumerationen nicht mit FlagsAttribute markieren. Eine extern sichtbare Enumeration wird mit FlagsAttribute gekennzeichnet und weist einen oder mehrere Werte auf, die keine Potenzen von 2 und keine Kombination von anderen in der Enumeration definierten Werten bilden.
CA2218: GetHashCode beim Überschreiben von Equals überschreiben. Ein öffentlicher Typ überschreibt System.Object.Equals, jedoch nicht System.Object.GetHashCode.
CA2219: Keine Ausnahmen in Ausnahmeklauseln auslösen. Wenn eine Ausnahme in einer finally-Klausel oder fault-Klausel ausgelöst wird, wird die aktive Ausnahme von der neuen Ausnahme verdeckt. Wenn eine Ausnahme in einer filter-Klausel ausgelöst wird, fängt die Laufzeit die Ausnahme automatisch ab. Dadurch ist der ursprüngliche Fehler nur schwer zu erkennen und zu debuggen.
CA2224: Equals beim Überladen von Gleichheitsoperatoren überschreiben. Ein öffentlicher Typ implementiert den Gleichheitsoperator, überschreibt System.Object.Equals jedoch nicht.
CA2225: Operatorüberladungen weisen benannte Alternativen auf. Es wurde eine Operatorüberladung erkannt, und die erwartete benannte Alternativmethode wurde nicht gefunden. Der benannte Alternativmember gewährt auf die gleiche Funktionalität wie der Operator Zugriff und wird für Entwickler bereitgestellt, die in Sprachen programmieren, in denen überladene Operatoren nicht unterstützt werden.
CA2226: Operatoren sollten symmetrische Überladungen aufweisen. Ein Typ implementiert den Gleichheits- oder Ungleichheitsoperator, ohne den entgegengesetzten Operator zu implementieren.
CA2227: Sammlungseigenschaften sollten schreibgeschützt sein. Eine schreibbare Auflistungseigenschaft ermöglicht es Benutzern, die Auflistung durch eine andere Auflistung zu ersetzen. Eine schreibgeschützte Eigenschaft sorgt dafür, dass die Auflistung nicht mehr ersetzt wird, lässt aber dennoch das Festlegen einzelner Member zu.
CA2229: Serialisierungskonstruktoren implementieren. Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie den Serialisierungskonstruktor. Definieren Sie den Konstruktor bei einer versiegelten Klasse als privaten Konstruktor. Definieren Sie ihn andernfalls als geschützten Konstruktor.
CA2231: Überladen Sie den Gleichheitsoperator beim Überschreiben von ValueType.Equals. Ein Werttyp überschreibt Object.Equals, implementiert jedoch nicht den Gleichheitsoperator.
CA2234: Übergeben Sie System.Uri-Objekte anstelle von Zeichenfolgen. Eine Methode wird aufgerufen, die über einen Zeichenfolgenparameter verfügt, dessen Name "uri", "URI", "urn", "URN", "url" oder "URL" enthält. Der deklarierende Typ der Methode enthält eine entsprechende Methodenüberladung, die über einen System.Uri-Parameter verfügt.
CA2235: Alle nicht serialisierbaren Felder markieren. Ein Instanzenfeld eines Typs, der nicht serialisierbar ist, ist in einem serialisierbaren Typ deklariert.
CA2237: ISerializable-Typen mit SerializableAttribute markieren. Damit Typen von der Common Language Runtime als serialisierbar erkannt werden, müssen sie mit dem SerializableAttribute-Attribut markiert werden, auch wenn der Typ durch die Implementierung der ISerializable-Schnittstelle eine benutzerdefinierte Serialisierungsroutine verwendet.
CA2241: Geben Sie die korrekte Anzahl für Formatierungsmethoden an. Das an System.String.Format übergebene format-Argument enthält keine Formatelemente, die den einzelnen Objektargumenten entsprechen oder umgekehrt.
CA2242: Ordnungsgemäß auf NaN testen. Mit diesem Ausdruck testen Sie einen Wert auf Single.Nan oder Double.Nan. Testen Sie den Wert mithilfe von Single.IsNan(Single) oder Double.IsNan(Double).
CA2243: Attribute-Zeichenfolgenliterale müssen stets richtig analysiert werden. Der Zeichenfolgenliteral-Parameter eines Attributs wird für eine URL, GUID oder Version nicht ordnungsgemäß analysiert.
CA2244: Keine Initialisierungen indizierter Elemente duplizieren Ein Objektinitialisierer verfügt über mehr als einen indizierten Elementinitialisierer mit demselben konstanten Index. Alle bis auf den letzten Initialisierer sind redundant.
CA2245: Keine Zuweisung einer Eigenschaft zu sich selbst Eine Eigenschaft wurde versehentlich sich selbst zugewiesen.
CA2246: Keine Zuweisung eines Symbols und seines Members in der gleichen Anweisung Es wird nicht empfohlen, ein Symbol und sein Member, d. h. ein Feld oder eine Eigenschaft, in der gleichen Anweisung zuzuweisen. Es ist nicht eindeutig, ob für den Memberzugriff der alte Wert des Symbols vor der Zuweisung oder der neu zugewiesene Wert in dieser Anweisung verwendet werden soll.
CA2247: Anstelle einer TaskContinuationOptions-Enumeration eine TaskCreationOptions-Enumeration als Argument an den TaskCompletionSource-Konstruktor übergeben TaskCompletionSource verfügt über Konstruktoren, die TaskCreationOptions verwenden, welche die zugrunde liegende Aufgabe steuern, und Konstruktoren, die den Objektzustand annehmen, der in der Aufgabe gespeichert ist. Das versehentliche übergeben von TaskContinuationOptions anstelle von TaskCreationOptions führt dazu, dass der Aufruf die Optionen als Zustand behandelt.
CA2248: Richtiges enum-Argument für Enum.HasFlag angeben Der Enumerationstyp, der als Argument an den HasFlag-Methodenaufruf übergeben wird, unterscheidet sich vom aufrufenden Enumerationstyp.
CA2249: Erwägen Sie die Verwendung von "String.Contains" anstelle von "String.IndexOf" Aufrufe von string.IndexOf, bei denen anhand des Ergebnisses überprüft wird, ob ein Substring vorhanden oder nicht vorhanden ist, können durch string.Contains ersetzt werden.
CA2250: ThrowIfCancellationRequested verwenden ThrowIfCancellationRequested überprüft automatisch, ob das Token abgebrochen wurde, und löst eine OperationCanceledException aus, falls dies der Fall ist.
CA2251: String.Equals anstelle von String.Compare verwenden Die Verwendung von String.Equals ist klarer und wahrscheinlich schneller, anstatt das Ergebnis von String.Compare mit 0 (null) zu vergleichen.
CA2252: Vorschaufeatures abonnieren Abonnieren Sie Vorschaufeatures, bevor Sie Vorschau-APIs verwenden.
CA2253: Benannte Platzhalter dürfen keine numerischen Werte sein Benannte Platzhalter in der Vorlage für Protokollierungsnachrichten dürfen nicht nur aus numerischen Zeichen bestehen.
CA2254: Vorlage muss ein statischer Ausdruck sein Die Vorlage für Protokollierungsnachrichten darf nicht zwischen Aufrufen variieren.
CA2255: Attribut ModuleInitializer nicht in Bibliotheken verwenden Modulinitialisierer sind zur Verwendung im Anwendungscode vorgesehen, um die Initialisierung der Anwendungskomponenten sicherzustellen, bevor der Anwendungscode mit der Ausführung beginnt.
CA2256: Alle in übergeordneten Schnittstellen deklarierten Member müssen über eine Implementierung in einer Schnittstelle mit dem Attribut „DynamicInterfaceCastableImplementation“ verfügen Typen, denen das Attribut DynamicInterfaceCastableImplementationAttribute zugeordnet wird, fungieren als Schnittstellenimplementierung für einen Typ, der den IDynamicInterfaceCastable-Typ implementiert. Daher muss er eine Implementierung aller in den geerbten Schnittstellen definierten Member bereitstellen, weil der Typ, der IDynamicInterfaceCastable implementiert, sie andernfalls nicht bereitstellt.
CA2257: Die für eine Schnittstelle mit dem „DynamicInterfaceCastableImplementationAttribute“ definierten Member müssen „static“ sein Da ein typ, der implementiert IDynamicInterfaceCastable , möglicherweise keine dynamische Schnittstelle in Metadaten implementiert, werden Aufrufe eines Instanzschnittstellenmitglieds, das keine explizite Implementierung ist, die für diesen Typ definiert ist, wahrscheinlich zur Laufzeit fehlschlagen. Markieren Sie neue Schnittstellenmember als static, um Laufzeitfehler zu vermeiden.
CA2258: Die Bereitstellung einer „DynamicInterfaceCastableImplementation“-Schnittstelle in Visual Basic wird nicht unterstützt Für das Bereitstellen einer funktionalen Schnittstelle mit zugeordnetem DynamicInterfaceCastableImplementationAttribute-Attribut ist das Feature Standardschnittstellen-Member erforderlich, das in Visual Basic nicht unterstützt wird.
CA2259: Sicherstellen, dass ThreadStatic nur mit statischen Feldern verwendet wird ThreadStaticAttribute wirkt sich nur auf Shared-Felder (static in Visual Basic) aus. Wenn es auf Instanzfelder angewendet wird, besitzt das Attribut keine Auswirkungen auf das Verhalten.
CA2260: Korrekte Implementierung generischer mathematischer Schnittstellen Generische mathematische Schnittstellen erfordern, dass der abgeleitete Typ selbst für den sich wiederholenden Typparameter verwendet wird.
CA2261: Nicht verwenden ConfigureAwaitOptions.SuppressThrowing mit Task<TResult> Die ConfigureAwaitOptions.SuppressThrowing Option wird von der generischen Task<TResult>-Option nicht unterstützt, da dies zu einer ungültigen TResult-Wiedergabe führen kann.
CA2262: Legen Sie MaxResponseHeadersLength ordnungsgemäß fest. Stellen Sie sicher, dass der Wert MaxResponseHeadersLength korrekt angegeben wird. Dieser Wert wird in Kilobyte gemessen.
CA2263: Generische Überladung bevorzugen, wenn der Typ bekannt ist Die Verwendung einer generischen Überladung empfiehlt es sich, ein System.Type Argument zu übergeben, wenn der Typ bekannt ist, da sie übersichtlicheren und typsichereren Code mit verbesserten Kompilierungszeitprüfungen fördern.
CA2264: Übergeben Sie keinen nicht nullfähigen Wert an 'ArgumentNullException.ThrowIfNull' 'ArgumentNullException.ThrowIfNull' wird ausgelöst, wenn das übergebene Argument "null" ist. Bestimmte Konstrukte wie nicht nullable Structs, und 'nameof()' und 'new' Ausdrücke sind bekannt, dass nie Null sein, sodass 'ArgumentNullException.ThrowIfNull' niemals ausgelöst wird.
CA2265: Nicht vergleichen Span<T> null mit oder default Vergleichen sie eine Spanne mit null oder default machen sie möglicherweise nicht, was Sie beabsichtigt haben. default und das null Literal wird implizit in Span<T>.Empty.
CA2300: Nicht den unsicheren BinaryFormatter zur Deserialisierung verwenden Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2301: BinaryFormatter.Deserialize nicht ohne Festlegung von BinaryFormatter.Binder aufrufen Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2302: Festlegung von BinaryFormatter.Binder vor dem Aufruf von BinaryFormatter.Deserialize sicherstellen Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2305: Unsicheren Deserialisierer nicht verwenden: LosFormatter Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2310: Unsicheren Deserialisierer nicht verwenden: NetDataContractSerializer Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2311: Nicht deserialisieren, ohne zuerst NetDataContractSerializer.Binder festzulegen Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2312: Vor dem Deserialisieren sicherstellen, dass NetDataContractSerializer.Binder festgelegt ist Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2315: Unsicheren Deserialisierer nicht verwenden: ObjectStateFormatter Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2321: Nicht mit JavaScriptSerializer und SimpleTypeResolver deserialisieren Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2322: Vor dem Deserialisieren sicherstellen, dass JavaScriptSerializer nicht mit SimpleTypeResolver initialisiert ist Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2326: Keine anderen TypeNameHandling-Werte als None (Keine) verwenden Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2327: Keine unsichere JsonSerializerSettings-Klasse verwenden Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2328: Sicherstellen, dass JsonSerializerSettings sicher ist Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2329: Nicht mit JsonSerializer mit unsicherer Konfiguration deserialisieren Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2330: Sicherstellen, dass JsonSerializer eine sichere Konfiguration bei der Deserialisierung verwendet Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen.
CA2350: Sicherstellen, dass die Eingabe von DataTable.ReadXml() vertrauenswürdig ist Beim Deserialisieren einer DataTable mit nicht vertrauenswürdigen Eingaben kann ein Angreifer schädliche Eingaben erstellen, um einen Denial-of-Service-Angriff auszuführen. Möglicherweise gibt es unbekannte Sicherheitsrisiken für die Remotecodeausführung.
CA2351: Sicherstellen, dass die Eingabe von DataSet.ReadXml() vertrauenswürdig ist Beim Deserialisieren einer DataSet mit nicht vertrauenswürdigen Eingaben kann ein Angreifer schädliche Eingaben erstellen, um einen Denial-of-Service-Angriff auszuführen. Möglicherweise gibt es unbekannte Sicherheitsrisiken für die Remotecodeausführung.
CA2352: Unsichere DataSet- oder DataTable-Elemente in einem serialisierbaren Typ können anfällig für Angriffe durch Remotecodeausführung sein Eine mit SerializableAttribute markierte Klasse oder Struktur enthält ein DataSet- oder DataTable-Feld bzw. eine entsprechende Eigenschaft und weist kein GeneratedCodeAttribute auf.
CA2353: Unsichere DataSet- oder DataTable-Elemente in einem serialisierbaren Typ Eine mit einem XML-Serialisierungsattribut oder einem Datenvertragsattribut markierte Klasse oder Struktur enthält ein DataSet- oder DataTable-Feld bzw. eine entsprechende Eigenschaft.
CA2354: Unsichere DataSet- oder DataTable-Elemente in einem deserialisierten Objektgraph können anfällig für Angriffe durch Remotecodeausführung sein Die Deserialisierung erfolgt mit einem serialisierten System.Runtime.Serialization.IFormatter, und der Objektgraph des umgewandelten Typs kann ein DataSet oder eine DataTable enthalten.
CA2355: Unsichere DataSet- oder DataTable-Elemente in einem deserialisierten Objektgraph Die Deserialisierung erfolgt, wenn der Objektgraph des umgewandelten oder angegebenen Typs ein DataSet oder eine DataTable enthalten kann.
CA2356: Unsicheres DataSet oder unsichere DataTable in einem webdeserialisierten Objektgraph Eine Methode mit einem System.Web.Services.WebMethodAttribute oder System.ServiceModel.OperationContractAttribute einem Parameter, der auf ein DataSet oder mehrere DataTableParameter verweist.
CA2361: Sicherstellen, dass die automatisch generierte Klasse mit DataSet.ReadXml() nicht mit nicht vertrauenswürdigen Daten verwendet wird Beim Deserialisieren einer DataSet mit nicht vertrauenswürdigen Eingaben kann ein Angreifer schädliche Eingaben erstellen, um einen Denial-of-Service-Angriff auszuführen. Möglicherweise gibt es unbekannte Sicherheitsrisiken für die Remotecodeausführung.
CA2362: Ein unsicheres DataSet- oder DataTable-Element in einem automatisch generierten, serialisierbaren Typ kann für Angriffe durch Remotecodeausführung anfällig sein Wenn eine nicht vertrauenswürdige Eingabe mit BinaryFormatter deserialisiert wird und der deserialisierte Objektgraph ein DataSet oder eine DataTable enthält, kann ein Angreifer eine schädliche Payload erstellen, um einen Angriff mit Remotecodeausführung zu starten.
CA3001: Review code for SQL injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusung von SQL-Befehlen) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben und SQL-Befehlen besonders auf mögliche Angriffe durch Einschleusung von SQL-Befehlen. Ein Angriff durch Einschleusung von SQL-Befehlen kann schädliche SQL-Befehle ausführen und so die Sicherheit und Integrität Ihrer Anwendung gefährden.
CA3002: Review code for XSS vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch XSS) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben aus Webanforderungen besonders auf mögliche XSS-Angriffe (Cross-Site Scripting). Ein XSS-Angriff schleust nicht vertrauenswürdige Eingaben in die unformatierte HTML-Ausgabe ein, sodass ein Angreifer schädliche Skripts ausführen oder den Inhalt Ihrer Webseite in böswilliger Absicht ändern kann.
CA3003: Review code for file path injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen über einen Dateipfad) Seien Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben aus Webanforderungen besonders vorsichtig, wenn Sie beim Angeben von Pfaden zu Dateien benutzergesteuerte Eingaben verwenden.
CA3004: Review code for information disclosure vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken bei der Veröffentlichung von Informationen) Die Offenlegung von Ausnahmeinformationen bietet Angreifern Einblicke in die Interna Ihrer Anwendung, die diesen Angreifern wiederum bei der Suche nach weiteren Sicherheitslücken helfen können.
CA3005: Überprüfen von Code für LDAP-Einfügungsrisiken Beachten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben Angriffe über LDAP-Einschleusung (Lightweight Directory Access Protocol). Ein Angreifer kann potenziell böswillige LDAP-Anweisungen für Informationsverzeichnisse ausführen. Anwendungen, die Benutzereingaben verwenden, um dynamische LDAP-Anweisungen für den Zugriff auf Verzeichnisdienste zu erstellen, sind besonders anfällig.
CA3006: Review code for process command injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusung von Prozessbefehlen) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben besonders auf mögliche Angriffe durch Befehlseinschleusung. Ein Angriff durch Einschleusen von Befehlen kann schädliche Befehle im zugrunde liegenden Betriebssystem ausführen und so die Sicherheit und Integrität des Servers gefährden.
CA3007: Review code for open redirect vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch offene Umleitungen) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben besonders auf Sicherheitsrisiken durch eine offene Weiterleitung. Ein Angreifer kann das Sicherheitsrisiko einer offenen Weiterleitung ausnutzen, um Ihre Website so zu nutzen, dass sie den Anschein einer legitimen URL erweckt, einen ahnungslosen Besucher jedoch auf eine Phishing- oder anderweitig schädliche Website weiterleitet.
CA3008: Review code for XPath injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen von XPath-Befehlen) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben besonders auf mögliche Angriffe durch XPath-Einschleusung. Das Erstellen von XPath-Abfragen mithilfe nicht vertrauenswürdiger Eingaben kann es einem Angreifer ermöglichen, die Abfrage böswillig zu bearbeiten, um ein unbeabsichtigtes Ergebnis zurückzugeben und möglicherweise den Inhalt des abgefragten XML offenzulegen.
CA3009: Review code for XML injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen von XML-Befehlen) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben besonders auf mögliche Angriffe durch XML-Einschleusung.
CA3010: Review code for XAML injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen von XAML-Befehlen) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben besonders auf mögliche Angriffe durch XAML-Einschleusung. XAML ist eine Markupsprache, die Objektinstanziierung und -ausführung direkt darstellt. Das bedeutet, dass in XAML erstellte Elemente mit Systemressourcen interagieren können (z. B. Netzwerkzugriff und Dateisystem-E/A).
CA3011: Review code for DLL injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen von DLL) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben besonders darauf, dass kein nicht vertrauenswürdiger Code geladen werden kann. Wenn Ihre Webanwendung nicht vertrauenswürdigen Code lädt, kann ein Angreifer bösartige DLLs in Ihren Prozess einfügen und bösartigen Code ausführen.
CA3012: Review code for regex injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen von RegEx) Achten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben besonders auf mögliche Angriffe durch RegEx-Einschleusung. Ein Angreifer kann die RegEx-Einschleusung verwenden, um einen regulären Ausdruck böswillig so zu ändern, dass dieser mit unbeabsichtigten Ergebnissen übereinstimmt oder übermäßig viel CPU verbraucht, was zu einem Denial-of-Service-Angriff führt.
CA3061: Fügen Sie kein Schema nach URL hinzu. Verwenden Sie nicht die unsichere Überladung der Add-Methode, da sie gefährliche externe Bezüge verursachen kann.
CA3075: Unsichere DTD-Verarbeitung. Wenn Sie unsichere DTDProcessing-Instanzen verwenden oder auf externe Entitätsquellen verweisen, akzeptiert der Parser möglicherweise nicht vertrauenswürdige Eingaben und offenlegt vertrauliche Informationen an Angreifer.
CA3076: Unsichere XSLT-Skriptausführung. Wenn Sie extensible Stylesheet Language Transformations (XSLT) in .NET-Anwendungen unsicher ausführen, löst der Prozessor möglicherweise nicht vertrauenswürdige URI-Verweise auf, die vertrauliche Informationen für Angreifer offenlegen könnten, was zu Denial-of-Service- und Websiteübergreifenden Angriffen führt.
CA3077: Unsichere Verarbeitung in API-Design, XML-Dokument und XML-Textreader. Beim Entwerfen einer von XMLDocument und XMLTextReader abgeleiteten API sollten Sie DtdProcessing berücksichtigen. Die Verwendung unsicherer DTDProcessing-Instanzen beim Verweisen oder Auflösen externer Entitätsquellen oder festlegen unsicherer Werte im XML-Code kann zu einer Offenlegung von Informationen führen.
CA3147: Verbhandler mit ValidateAntiForgeryToken markieren. Achten Sie beim Entwerfen eines ASP.NET MVC-Controllers besonders auf mögliche Angriffe durch websiteübergreifende Anforderungsfälschung. Mit einem websiteübergreifenden Anforderungsfälschungsangriff können schädliche Anforderungen von einem authentifizierten Benutzer an Ihren ASP.NET MVC-Controller gesendet werden.
CA5350: Keine schwachen Kryptografiealgorithmen verwenden. Unsichere Verschlüsselungsalgorithmen und Hashfunktionen werden heute aus verschiedenen Gründen verwendet, sollten jedoch nicht verwendet werden, um die Vertrauenswürdigkeit oder Integrität der Daten, die sie schützen, zu gewährleisten. Dieser Regel wird ausgelöst, wenn im Code TripleDES-, SHA1- oder RIPEMD160-Algorithmen gefunden werden.
CA5351: Keine beschädigten kryptografischen Algorithmen verwenden Unterbrochene kryptografische Algorithmen werden nicht als sicher betrachtet; ihre Verwendung sollte unbedingt unterbunden werden. Diese Regel wird ausgelöst, wenn der MD5-Hash-Algorithmus oder DES- bzw. RC2-Verschlüsselungsalgorithmen im Code gefunden werden.
CA5358: Verwenden Sie keine unsicheren Verschlüsselungsmodi. Verwenden Sie keine unsicheren Verschlüsselungsmodi.
CA5359: Zertifikatüberprüfung nicht deaktivieren Ein Zertifikat kann die Identität des Servers authentifizieren. Clients sollten das Serverzertifikat überprüfen, um sicherzustellen, dass Anforderungen an den vorgesehenen Server gesendet werden. Wenn der ServerCertificateValidationCallback immer true zurückgibt, besteht jedes Zertifikat die Überprüfung.
CA5360: Keine gefährlichen Methoden bei der Deserialisierung aufrufen. Eine unsichere Deserialisierung ist ein Sicherheitsrisiko, das auftritt, wenn bei der Deserialisierung von Code nicht vertrauenswürdige Daten die Logik einer Anwendung missbrauchen, einen Denial-of-Service-Angriff (DoS-Angriff) verursachen oder sogar beliebigen Code bei Deserialisierung ausführen. Böswillige Benutzer können diese Deserialisierungsfeatures häufig missbrauchen, wenn die Anwendung nicht vertrauenswürdige Daten deserialisiert, die sich unter der Kontrolle der Angreifer befinden. Hierbei geht es im Besonderen um das Aufrufen gefährlicher Methoden im Prozess der Deserialisierung. Ein erfolgreicher Angriff aufgrund unsicherer Deserialisierung kann es dem Angreifer ermöglichen, DoS-Angriffe auszuführen, die Authentifizierung zu umgehen und Remotecode auszuführen.
CA5361: Verwendung der starken Kryptografie durch Schannel nicht deaktivieren Das Festlegen von Switch.System.Net.DontEnableSchUseStrongCrypto auf true schwächt die Kryptografie in ausgehenden TLS-Verbindungen (Transport Layer Security). Eine schwächere Kryptografie kann die Vertraulichkeit der Kommunikation zwischen Ihrer Anwendung und dem Server gefährden und es Angreifern erleichtern, sich Zugang zu vertraulichen Daten zu verschaffen.
CA5362: Potenzieller Verweiszyklus in deserialisiertem Objektgraph Beim Deserialisieren nicht vertrauenswürdiger Daten muss jeder Code, der den deserialisierten Objektgraph verarbeitet, Verweiszyklen verarbeiten, ohne in eine Endlosschleife zu geraten. Dies betrifft sowohl Code, der zu einem Deserialisierungsrückruf gehört, als auch Code, der den Objektgraph nach Abschluss der Deserialisierung verarbeitet. Andernfalls könnte ein Angreifer einen Denial-of-Service-Angriff mit schädlichen Daten durchführen, die einen Verweiszyklus enthalten.
CA5363: Deaktivieren Sie die Anforderungsüberprüfung nicht. Die Anforderungsüberprüfung ist ein Feature in ASP.NET, das HTTP-Anforderungen untersucht und bestimmt, ob diese potenziell gefährliche Inhalte enthalten, die zu Einschleusungsangriffen wie z. B. Cross-Site Scripting führen können.
CA5364: Verwenden Sie keine veralteten Sicherheitsprotokolle. Transport Layer Security (TLS) sichert die Kommunikation zwischen Computern, meist in Verbindung mit Hypertext Transfer Protocol Secure (HTTPS). Ältere Protokollversionen von TLS sind weniger sicher als TLS 1.2 und TLS 1.3, daher ist es wahrscheinlicher, dass diese Versionen neue Sicherheitsrisiken aufweisen. Vermeiden Sie ältere Protokollversionen, um das Risiko zu minimieren.
CA5365: Überprüfung von HTTP-Headern nicht deaktivieren Die HTTP-Headerüberprüfung ermöglicht die Codierung der Wagenrücklauf- und Zeilenvorschubzeichen „\r“ bzw. „\n“, die sich in Antwortheadern finden. Mit dieser Codierung lassen sich Einschleusungsangriffe vermeiden, die eine Anwendung ausnutzen, die nicht vertrauenswürdige Daten im Header zurückgibt.
CA5366: XmlReader zum Lesen von DataSet-XML verwenden Die Verwendung eines DataSet XML-Codes zum Lesen von nicht vertrauenswürdigen Daten kann gefährliche externe Verweise laden, die mit einem XmlReader sicheren Resolver oder mit deaktivierter DTD-Verarbeitung eingeschränkt werden sollten.
CA5367: Typen mit Zeigerfeldern dürfen nicht serialisiert werden. Diese Regel überprüft, ob eine serialisierbare Klasse mit Zeigerfeld oder -Eigenschaft vorhanden ist. Member, die nicht serialisiert werden können, können Zeiger sein, beispielsweise statische Member oder Felder, die mit NonSerializedAttribute gekennzeichnet sind.
CA5368: Festlegen von ViewStateUserKey für von der Seite abgeleitete Klassen Durch Festlegen der Eigenschaft ViewStateUserKey können Sie Angriffe auf Ihre Anwendung verhindern, indem Sie der view-state-Variable für einzelne Benutzer einen Bezeichner zuweisen, damit Angreifer die Variable nicht für einen Angriff verwenden können. Andernfalls bestehen Sicherheitsrisiken durch eine websiteübergreifende Anforderungsfälschung.
CA5369: Verwenden Sie XmlReader zur Deserialisierung. Die Verarbeitung nicht vertrauenswürdiger DTD- und XML-Schemas kann das Laden gefährlicher externer Verweise ermöglichen, was durch die Verwendung eines XmlReader mit einem sicheren Resolver oder mit deaktivierter DTD- und XML-Inlineschemaverarbeitung eingeschränkt werden sollte.
CA5370: Verwenden Sie XmlReader als überprüfenden Reader. Die Verarbeitung nicht vertrauenswürdiger DTD- und XML-Schemas kann das Laden gefährlicher externer Verweise ermöglichen. Dies kann eingeschränkt werden, indem ein XmlReader-Element mit einem sicheren Konfliktlöser oder deaktivierter Inlineschemaverarbeitung für DTD und XML verwendet wird.
CA5371: Verwenden Sie XmlReader für Schemalesevorgänge. Die Verarbeitung nicht vertrauenswürdiger DTD- und XML-Schemas kann das Laden gefährlicher externer Verweise ermöglichen. Die Verwendung eines XmlReader-Elements mit einem sicheren Konfliktlöser oder deaktivierter Inlineschemaverarbeitung für DTD und XML schränkt dies ein.
CA5372: Verwenden Sie XmlReader für XPathDocument. Die Verarbeitung von XML aus nicht vertrauenswürdigen Daten kann gefährliche externe Verweise laden, die mithilfe eines XmlReader mit einem sicheren Resolver oder mit deaktivierter DTD-Verarbeitung eingeschränkt werden können.
CA5373: Verwenden Sie keine veraltete Schlüsselableitungsfunktion. Diese Regel erkennt den Aufruf der schwachen Schlüsselableitungsmethoden System.Security.Cryptography.PasswordDeriveBytes und Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes verwendete den schwachen Algorithmus PBKDF1.
CA5374: Kein XslTransform verwenden Diese Regel überprüft, ob System.Xml.Xsl.XslTransform im Code instanziiert ist. System.Xml.Xsl.XslTransform ist jetzt veraltet und sollte nicht mehr verwendet werden.
CA5375: Shared Access Signature des Kontos nicht verwenden. Eine Konto-SAS kann den Zugriff auf Lese-, Schreib- und Löschvorgänge in Blobcontainern, Tabellen, Warteschlangen und Dateifreigaben delegieren, die mit einer Dienst-SAS nicht zulässig sind. Sie unterstützt allerdings keine Richtlinien auf Containerebene und bietet weniger Flexibilität und Kontrolle über die gewährten Berechtigungen. Sobald böswillige Benutzer Zugang erlangt haben, ist Ihr Speicherkonto stark gefährdet.
CA5376: SharedAccessProtocol.HttpsOnly verwenden. Bei einer SAS handelt es sich um vertrauliche Daten, die nicht im Nur-Text-Format über HTTP übertragen werden dürfen.
CA5377: Zugriffsrichtlinie auf Containerebene verwenden. Eine Zugriffsrichtlinie auf Containerebene kann jederzeit geändert oder widerrufen werden. Sie bietet mehr Flexibilität und eine bessere Kontrolle über die gewährten Berechtigungen.
CA5378: Deaktivieren Sie ServicePointManagerSecurityProtocols nicht. Durch Festlegen von Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols auf true werden die Transport Layer Security-Verbindungen (TLS) für Windows Communication Foundation (WCF) auf die Verwendung von TLS 1.0 beschränkt. Diese Version von TLS wird als veraltet markiert.
CA5379: Verwenden Sie keinen Algorithmus der Schwachschlüsselableitungsfunktion Die Klasse Rfc2898DeriveBytes verwendet standardmäßig den Algorithmus SHA1. Sie müssen den Hashalgorithmus angeben, der in einigen Überladungen des Konstruktors mit SHA256 oder höher verwendet werden soll. Hinweis: Die Eigenschaft HashAlgorithm besitzt nur eine get-Zugriffsmethode, keinen overridden-Modifizierer.
CA5380: Fügen Sie keine Zertifikate zum Stammspeicher hinzu. Diese Regel erkennt Code, mit dem ein Zertifikat zum Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen hinzugefügt wird. Standardmäßig ist der Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen mit mehreren öffentlichen Zertifizierungsstellen konfiguriert, die die Anforderungen des Microsoft-Programms für Stammzertifikate erfüllen.
CA5381: Stellen Sie sicher, dass keine Zertifikate zum Stammspeicher hinzugefügt werden. Diese Regel erkennt Code, mit dem potenziell ein Zertifikat zum Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen hinzugefügt werden kann. Standardmäßig ist der Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen mit mehreren öffentlichen Zertifizierungsstellen konfiguriert, die die Anforderungen des Microsoft-Programms für Stammzertifikate erfüllen.
CA5382: Sichere Cookies in ASP.NET Core verwenden Anwendungen, die über HTTPS zur Verfügung gestellt werden, müssen sichere Cookies verwenden, die den Browser anweisen, den Cookie nur mit SSL (Secure Sockets Layer) zu übertragen.
CA5383: Sicherstellen, dass sichere Cookies in ASP.NET Core verwendet werden Anwendungen, die über HTTPS zur Verfügung gestellt werden, müssen sichere Cookies verwenden, die den Browser anweisen, den Cookie nur mit SSL (Secure Sockets Layer) zu übertragen.
CA5384: Digitalen Signaturalgorithmus (DSA) nicht verwenden DSA ist ein schwacher asymmetrischer Verschlüsselungsalgorithmus.
CA5385: RSA-Algorithmus (Rivest – Shamir – Adleman) mit ausreichender Schlüsselgröße verwenden Ein RSA-Schlüssel, der kleiner als 2048 Bits ist, ist anfälliger für Brute-Force-Angriffe.
CA5386: Vermeiden Sie die Hartcodierung des SecurityProtocolType-Werts. Transport Layer Security (TLS) sichert die Kommunikation zwischen Computern, meist in Verbindung mit Hypertext Transfer Protocol Secure (HTTPS). Die Protokollversionen TLS 1.0 und TLS 1.1 sind veraltet, die Versionen TLS 1.2 und TLS 1.3 sind aktuell. In Zukunft ist TLS 1.2 und TLS 1.3 möglicherweise veraltet. Um zu gewährleisten, dass Ihre Anwendung jederzeit sicher ist, vermeiden Sie die Hartcodierung einer Protokollversion, und geben Sie mindestens .NET Framework v4.7.1 als Ziel an.
CA5387: Schwache Schlüsselableitungsfunktion nicht mit unzureichender Iterationsanzahl verwenden Diese Regel prüft, ob von Rfc2898DeriveBytes ein Kryptografieschlüssel mit einer Iterationsanzahl von weniger als 100.000 generiert wurde. Eine höhere Iterationsanzahl kann bei der Vermeidung von Wörterbuchangriffen helfen, bei denen versucht wird, den generierten Kryptografieschlüssel zu erraten.
CA5388: Sicherstellen einer ausreichenden Iterationsanzahl bei Verwendung einer schwachen Schlüsselableitungsfunktion Diese Regel überprüft, ob ein kryptografischer Schlüssel mit Rfc2898DeriveBytes einer Iterationsanzahl generiert wurde, die unter 100.000 liegt. Eine höhere Iterationsanzahl kann bei der Vermeidung von Wörterbuchangriffen helfen, bei denen versucht wird, den generierten Kryptografieschlüssel zu erraten.
CA5389: Fügen Sie den Pfad des Archivelements nicht zum Pfad des Zieldateisystems hinzu. Der Dateipfad kann relativ sein und zu Dateisystemzugriff außerhalb des erwarteten Zielpfads im Dateisystem führen. Dies wiederum kann zu schädlichen Konfigurationsänderungen und einer Remoteausführung von Code aus dem Hinterhalt (Lay-and-Wait-Technik) führen.
CA5390: Keine Hartcodierung von Verschlüsselungsschlüsseln Damit ein symmetrischer Algorithmus funktioniert, darf der geheime Schlüssel nur dem Absender und dem Empfänger bekannt sein. Wenn ein Schlüssel hart codiert wird, lässt er sich leicht entdecken. Selbst aus kompilierten Binärdateien kann er von böswilligen Benutzern ganz einfach extrahiert werden. Sobald der private Schlüssel aufgedeckt wurde, kann der Verschlüsselungstext direkt entschlüsselt werden und ist nicht mehr geschützt.
CA5391: Fälschungssicherheitstoken in ASP.NET Core MVC-Controllern verwenden. Die Behandlung eines POST, PUT, PATCHoder DELETE einer Anforderung, ohne ein Antiforgery-Token zu validieren, kann anfällig für websiteübergreifende Anforderungsverfälschungsangriffe sein. Mit einem websiteübergreifenden Anforderungsfälschungsangriff können böswillige Anforderungen von einem authentifizierten Benutzer an Ihren ASP.NET Core MVC-Controller gesendet werden.
CA5392: DefaultDllImportSearchPaths-Attribut für P/Invokes verwenden. Standardmäßig testen P/Invoke-Funktionen mit DllImportAttribute eine Reihe von Verzeichnissen, einschließlich des aktuellen Arbeitsverzeichnisses für die zu ladende Bibliothek. Dies kann bei einigen Anwendungen ein Sicherheitsproblem darstellen und zu DLL-Hijacking führen.
CA5393: Keinen unsicheren DllImportSearchPath-Wert verwenden. Die standardmäßigen DLL-Suchverzeichnisse und Assemblyverzeichnisse könnten eine schädliche DLL enthalten. Je nachdem, von wo aus Ihre Anwendung ausgeführt wird, könnte sich auch im Verzeichnis der Anwendung eine schädliche DLL befinden.
CA5394: Keine unsichere Zufälligkeitsstufe verwenden Durch die Verwendung eines kryptografisch schwachen Pseudo-Zufallszahlengenerators kann ein Angreifer vorhersagen, welcher sicherheitsrelevante Wert generiert wird.
CA5395: Fehlendes HttpVerb-Attribut für Aktionsmethoden. Alle Aktionsmethoden, die Daten erstellen, bearbeiten, löschen oder anderweitig ändern, müssen mit dem antiforgery-Attribut vor Angriffen durch siteübergreifende Anforderungsfälschung geschützt werden. Die Durchführung eines GET-Vorgangs sollte eine sichere Operation sein, die keine Nebenwirkungen hat und Ihre permanenten Daten nicht ändert.
CA5396: HttpOnly für HttpCookie auf TRUE festlegen Stellen Sie im Rahmen eines mehrschichtigen Schutzes sicher, dass sicherheitsrelevante HTTP-Cookies als „HttpOnly“ gekennzeichnet werden. Damit werden Webbrowser angewiesen, den Zugriff auf die Cookies durch Skripts nicht zuzulassen. Die Einschleusung von schädlichen Skripts ist eine gängige Methode, Cookies zu stehlen.
CA5397: Verwenden Sie keine veralteten SslProtocols-Werte. Transport Layer Security (TLS) sichert die Kommunikation zwischen Computern, meist in Verbindung mit Hypertext Transfer Protocol Secure (HTTPS). Ältere Protokollversionen von TLS sind weniger sicher als TLS 1.2 und TLS 1.3, daher ist es wahrscheinlicher, dass diese Versionen neue Sicherheitsrisiken aufweisen. Vermeiden Sie ältere Protokollversionen, um das Risiko zu minimieren.
CA5398: Vermeiden Sie hartcodierte SslProtocols-Werte. Transport Layer Security (TLS) sichert die Kommunikation zwischen Computern, meist in Verbindung mit Hypertext Transfer Protocol Secure (HTTPS). Die Protokollversionen TLS 1.0 und TLS 1.1 sind veraltet, die Versionen TLS 1.2 und TLS 1.3 sind aktuell. In Zukunft ist TLS 1.2 und TLS 1.3 möglicherweise veraltet. Um die Sicherheit Ihrer Anwendung dauerhaft zu gewährleisten, vermeiden Sie die Hartcodierung der Protokollversion.
CA5399: Überprüfung der HttpClient-Zertifikatsperrliste definitiv deaktivieren Ein widerrufenes Zertifikat ist nicht mehr vertrauenswürdig. Es könnte von Angreifern zum Übergeben von schädlichen Daten oder zum Stehlen vertraulicher Daten in der HTTPS-Kommunikation verwendet werden.
CA5400: Sicherstellen, dass die Überprüfung der HttpClient-Zertifikatsperrliste nicht deaktiviert ist Ein widerrufenes Zertifikat ist nicht mehr vertrauenswürdig. Es könnte von Angreifern zum Übergeben von schädlichen Daten oder zum Stehlen vertraulicher Daten in der HTTPS-Kommunikation verwendet werden.
CA5401: CreateEncryptor nicht mit Nicht-Standard-Initialisierungsvektoren verwenden Bei der symmetrischen Verschlüsselung muss immer ein nicht wiederholbarer Initialisierungsvektor verwendet werden, um Wörterbuchangriffe zu verhindern.
CA5402: CreateEncryptor mit Standard-Initialisierungsvektoren verwenden Bei der symmetrischen Verschlüsselung muss immer ein nicht wiederholbarer Initialisierungsvektor verwendet werden, um Wörterbuchangriffe zu verhindern.
CA5403: Keine Hartcodierung von Zertifikaten Der data- oder rawData-Parameter eines X509Certificate- oder X509Certificate2-Konstruktors ist hartcodiert.
CA5404: Token-Validierungsprüfungen nicht deaktivieren TokenValidationParameters Eigenschaften, die die Token-Validierung steuern, sollten nicht auf false gesetzt werden.
CA5405: Tokenvalidierung in Delegaten nicht immer überspringen Der AudienceValidator oder LifetimeValidator zugewiesene Rückruf gibt immer true zurück.
IL3000: Vermeiden des Zugriffs auf assemblydateipfade beim Veröffentlichen als einzelne Datei Vermeiden Sie den Zugriff auf den Assemblydateipfad beim Veröffentlichen als Einzeldatei.
IL3001: Vermeiden des Zugriffs auf assemblydateipfad bei der Veröffentlichung als einzelne Datei Vermeiden Sie den Zugriff auf den Assemblydateipfad beim Veröffentlichen als Einzeldatei.
IL3002: Vermeiden des Aufrufens von Mitgliedern, die mit "RequiresAssemblyFilesAttribute" gekennzeichnet sind, wenn sie als einzelne Datei veröffentlicht werden Vermeiden Sie das Aufrufen von Membern, die mit „RequiresAssemblyFilesAttribute“ kommentiert sind, wenn sie als einzelne Datei veröffentlicht werden.
IL3003: Anmerkungen zu „RequiresAssemblyFilesAttribute“ müssen für alle Schnittstellenimplementierungen oder Überschreibungen übereinstimmen. Anmerkungen zu „RequiresAssemblyFilesAttribute“ müssen für alle Schnittstellenimplementierungen oder Überschreibungen übereinstimmen.

Legende

Die folgende Tabelle zeigt die Art der Informationen, die für die einzelnen Regeln in der Referenzdokumentation bereitgestellt werden.

Element Beschreibung
type TypeName für die Regel.
Regel-ID Eindeutiger Bezeichner für die Regel. RuleId und Category werden für die Unterdrückung einer Warnung im Quellcode verwendet.
Kategorie Die Kategorie der Regel, z. B. Sicherheit.
Fix führt oder führt nicht zur Unterbrechung Gibt an, ob die Lösung einer Verletzung der Regel eine unterbrechende Änderung ist. Unterbrechende Änderung bedeutet, dass eine Assembly, die eine Abhängigkeit von dem Ziel aufweist, das die Verletzung verursacht hat, nicht mit der neuen behobenen Version erneut kompiliert wird oder aufgrund der Änderung zur Laufzeit möglicherweise fehlschlägt. Wenn mehrere Lösungen verfügbar sind und mindestens eine Lösung einen Breaking Change und eine Lösung keinen Breaking Change darstellt, werden sowohl „Breaking“ als auch „Non-Breaking“ angegeben.
Ursache Der spezielle verwaltete Code, aufgrund dessen die Regel eine Warnung generiert.
BESCHREIBUNG Erläutert die Probleme, die zur Warnung geführt haben.
Behandeln von Verstößen Erläutert, wie der Quellcode geändert werden kann, damit die Regel eingehalten wird und sie keine Warnung mehr generiert.
Wann sollten Warnungen unterdrückt werden? Beschreibt, wann es sicher ist, eine Warnung der Regel zu unterdrücken.
Beispielcode Beispiele, die die Regel verletzen, und korrigierte Beispiele, die die Regel erfüllen.
Ähnliche Regeln Ähnliche Regeln.