Pravidla pro kvalitu kódu

Analýza kódu .NET poskytuje pravidla, která mají za cíl zlepšit kvalitu kódu. Pravidla jsou uspořádaná do oblastí, jako je návrh, globalizace, výkon a zabezpečení. Určitá pravidla jsou specifická pro použití rozhraní .NET API, zatímco jiné se týkají obecné kvality kódu.

Index pravidel

Následující tabulka uvádí pravidla analýzy kvality kódu.

ID pravidla a upozornění Popis
CA1000: Nedeklarujte statické členy v obecných typech Při volání statického členu obecného typu musí být pro tento typ zadán argument typu. Je-li zavolán obecný člen instance, který nepodporuje odvozování, musí být pro tento člen zadán argument typu. V těchto dvou případech je syntaxe zadávání argumentu typu různá a snadno zaměnitelná.
CA1001: Typy vlastních uvolnitelných polí, které by měly být uvolnitelné Třída deklaruje a implementuje pole instance typu System.IDisposable, přičemž neimplementuje rozhraní IDisposable. Třída, která deklaruje pole IDisposable nepřímo, vlastní nespravovaný zdroj a měla by rozhraní IDisposable implementovat.
CA1002: Nezveřejňujte obecné seznamy System.Collections.Generic.List<(Of <(T>)>) je obecná kolekce určená pro výkon, nikoli dědičnost. Proto třída List neobsahuje žádné virtuální členy. Místo ní by měly být vystaveny kolekce navržené pro dědičnost.
CA1003: Použijte instance obecných obslužných rutin události Typ obsahuje delegáta, který vrací identifikátor, jehož podpis obsahuje dva parametry (první objekt a druhý typ, který je možné přiřadit eventArgs) a obsahující cíle sestavení Microsoft .NET Framework 2.0.
CA1005: Vyhněte se nadbytečným parametrům na obecných typech Čím více parametrů typu obecný typ obsahuje, tím obtížnější je vědět a zapamatovat si, co každý z parametrů typu představuje. Obvykle je to zřejmé u jednoho parametru typu, jako v seznamu<T>, a v některých případech, které mají dva parametry typu, jako ve slovníku<TKey, TValue>. Pokud však existují více než dva parametry typu, stává se pro většinu uživatelů použití příliš obtížným.
CA1008: Výčty by měly mít nulovou hodnotu Výchozí hodnota neinicializovaného výčtu je stejně jako u jiných typů hodnot nula. Atributovaný výčet bez příznaků by měl definovat člen za použití hodnoty nula tak, aby výchozí hodnota byla platnou hodnotou výčtu. Definuje-li výčet, který má aplikován atribut FlagsAttribute, člen s hodnotou nula, měl by jeho název být „None“, aby tak označoval, že ve výčtu nebyly nastaveny žádné hodnoty.
CA1010: Kolekce musí implementovat obecné rozhraní Použitelnost kolekce lze rozšířit implementací jednoho z rozhraní obecné kolekce. Pak lze tuto kolekci použít k zaplnění typů obecných kolekcí.
CA1012: Abstraktní typy by neměly mít veřejné konstruktory Konstruktory abstraktních typů mohou být volány pouze odvozenými typy. Jelikož veřejné konstruktory vytvářejí instance typu, přičemž nelze vytvořit instance abstraktního typu, je abstraktní typ obsahující veřejný konstruktor nesprávně navržen.
CA1014: Označte sestavení pomocí atributu CLSCompliantAttribute Specifikace Common Language Specification (CLS) definuje omezení názvů, datové typy a pravidla, která musí sestavení dodržovat, pokud budou použita napříč programovacími jazyky. Dobrý návrh určuje, že všechna sestavení explicitně označují dodržování předpisů CLS pomocí CLSCompliantAttribute . Není-li tento atribut v sestavení přítomen, nedodržuje sestavení specifikaci.
CA1016: Označte sestavení pomocí atributu AssemblyVersionAttribute .NET používá číslo verze k jednoznačné identifikaci sestavení a vytvoření vazby k typům v sestaveních se silným názvem. Číslo verze je používáno spolu se zásadou verze a vydavatele. Ve výchozím nastavení mohou být aplikace spuštěny pouze ve verzi sestavení, v níž byly sestaveny.
CA1017: Označte sestavení pomocí atributu ComVisibleAttribute Atribut ComVisibleAttribute určuje způsob přístupu klientů COM ke spravovanému kódu. Dobrý návrh přikazuje, aby sestavení explicitně uvedla viditelnost modelu COM. Viditelnost modelu COM může být nastavena pro celé sestavení a poté přepsána pro jednotlivé typy a členy typů. Není-li tento atribut přítomen, je obsah sestavení viditelný klientům COM.
CA1018: Označte atributy pomocí AttributeUsageAttribute Při definování vlastního atributu jej označte použitím atributu AttributeUsageAttribute, čímž je určeno, kde ve zdrojovém kódu může být vlastní atribut použit. Význam a zamýšlené použití atributu určuje jeho platné umístění v kódu.
CA1019: Definujte přístupové objekty pro argumenty atributu Atributy mohou definovat povinné argumenty, které musí být specifikovány při použití atributu na cíl. Říká se jim také poziční argumenty, jelikož jsou konstruktorům atributů předány jako poziční parametry. Pro každý povinný argument by měl atribut navíc poskytovat odpovídající vlastnost jen pro čtení, aby mohla být hodnota argumentu během spuštění získána. Atributy mohou také definovat volitelné argumenty, které jsou rovněž známy jako pojmenované argumenty. Tyto argumenty jsou podle názvu poskytovány konstruktorům atributů a měly by mít odpovídající vlastnost pro čtení i zápis.
CA1021: Vyhněte se výstupním parametrům Předávání typů odkazem (za použití klíčových slov „out“ nebo „ref“) vyžaduje zkušenosti s ukazateli, pochopení, jak se liší typy hodnot a typy odkazů, a schopnost práce s metodami vracejícími více návratových typů. Také rozdíl mezi parametry „out“ a „ref“ není běžně chápán.
CA1024: Použijte vlastnosti, kde je to vhodné Veřejná nebo chráněná metoda má název začínající na „Get“, nepřijímá žádné parametry a vrací hodnotu, která není polem. Metoda může být dobrým kandidátem, aby se stala vlastností.
CA1027: Označte výčty pomocí FlagsAttribute Výčet je typ hodnoty, který definuje množinu souvisejících pojmenovaných konstant. Mohou-li být pojmenované konstanty smysluplně kombinovány, použijte ve výčtu atribut FlagsAttribute.
CA1028: Úložiště výčtu by měl být Int32 Výčet je typ hodnoty, který definuje množinu souvisejících pojmenovaných konstant. Ve výchozím nastavení je pro uložení konstantní hodnoty použit datový typ System.Int32. Přestože lze tento typ změnit, není to ve většině případů zapotřebí ani doporučováno.
CA1030: Použijte události, kde je to vhodné Toto pravidlo zjišťuje metody, které mají názvy obvykle používané pro události. Je-li metoda volána jako odpověď na jednoznačně definovanou změnu stavu, měla by být metoda volána obslužnou rutinou události. Objekty volající tuto metodu by měly místo přímého volání metody vyvolat událost.
CA1031: Nezachycujte výjimky obecného typu Obecné výjimky by neměly být zachycovány. Zachyťte více specifickou výjimku nebo jako poslední příkaz v zachytávacím bloku opětovně vyvolejte obecnou výjimku.
CA1032: Implementujte standardní konstruktory výjimky Není-li dodána úplná sada konstruktorů, může být obtížné správně ošetřit výjimky.
CA1033: Metody rozhraní by měly být volatelné podřízenými typy Nezapečetěný externě viditelný typ poskytuje explicitní implementaci metod veřejného rozhraní a neposkytuje alternativní externě viditelnou metodu stejného názvu.
CA1034: Vnořené typy by neměly být viditelné Vnořený typ je typ deklarovaný v rámci jiného typu. Vnořené typy jsou užitečné pro zapouzdření soukromých podrobností implementace v daném typu. Jsou-li vnořené typy používány za tímto účelem, neměly by být externě viditelné.
CA1036: Přepište metody srovnatelných typů Veřejný nebo chráněný typ implementuje rozhraní System.IComparable. Nepřepisuje metodu Object.Equals ani nepřetěžuje operátory rovnosti, nerovnosti, menší než a větší než specifické pro daný jazyk.
CA1040: Vyhněte se prázdným rozhraním Rozhraní definují členy ujednávající jejich chování nebo užití. Funkčnost popsaná rozhraním může být osvojena libovolným typem bez ohledu na to, kde se typ vyskytuje v hierarchii dědičnosti. Typ implementuje rozhraní tím, že poskytuje implementace jeho členů. Prázdné rozhraní nedefinuje žádné členy, tudíž ani nedefinuje žádná implementovatelná ujednání.
CA1041: Poskytněte zprávu ObsoleteAttribute Typ nebo člen je označen atributem System.ObsoleteAttribute, aniž by měl zadánu vlastnost ObsoleteAttribute.Message. Při kompilaci typu nebo členu označeného atributem ObsoleteAttribute je zobrazena vlastnost zprávy tohoto atributu. To uživateli poskytuje informace o zastaralém typu nebo členu.
CA1043: Použijte celočíselný nebo řetězcový argument pro indexery Indexery (tj. indexované vlastnosti) by měly jako index používat celočíselné typy nebo typy řetězců. Tyto typy se obvykle používají pro indexování datových struktur a zvyšují použitelnost knihovny. Použití typu Object by mělo být omezeno na ty případy, kdy během návrhu není možné určit konkrétní celočíselný nebo řetězcový typ.
CA1044: Vlastnosti by neměly být pouze pro zápis Ačkoli je přijatelné a často nezbytné použít vlastnost jen pro čtení, směrnice návrhu zakazují použití vlastností jen pro zápis. Důvodem je skutečnost, že umožnit uživateli nastavit hodnotu a poté uživateli zabránit v zobrazení této hodnoty není bezpečné. Taktéž bez přístupu pro čtení není možné zobrazit stav sdílených objektů, což omezuje jejich užitečnost.
CA1045: Nepředávejte typy odkazem Předávání typů odkazem (za použití klíčových slov „out“ nebo „ref“) vyžaduje zkušenosti s ukazateli, pochopení, jak se liší typy hodnot a typy odkazů a schopnost práce s metodami vracejícími více návratových typů. Architekti knihoven, kteří navrhují pro širokou cílovou skupinu, by neměli očekávat, že uživatelé budou moct pracovat s parametry nebo ref s out parametry.
CA1046: Nepřetěžujte operátory rovnosti na odkazových typech U referenčních typů je výchozí implementace operátoru rovnosti téměř vždy správná. Ve výchozím nastavení jsou dva odkazy rovny, pouze pokud ukazují na stejný objekt.
CA1047: Nedeklarujte chráněné členy v zapečetěných typech Typy deklarují chráněné členy, aby k nim odvozené typy mohly přistupovat nebo je přepisovat. Dle definice nelze dědit zapečetěné typy, což znamená, že nelze volat chráněné metody zapečetěných typů.
CA1050: Deklarujte typy v oborech názvů Typy jsou deklarovány v oborech názvů, aby bylo zabráněno kolizím názvů a zároveň jako způsob organizace souvisejících typů v hierarchii objektů.
CA1051: Nedeklarujte viditelná pole instance Hlavní použití pole by mělo být jako podrobnost implementace. Pole by měla být soukromá nebo vnitřní a měla by být vystavena s použitím vlastností.
CA1052: Statický vlastník typů by měl být zapečetěný Veřejný nebo chráněný typ obsahuje pouze statické členy a není deklarován s použitím zapečetěného modifikátoru (NotInheritable) (jazyk C#). Typu, u nějž není zamýšleno dědění, by mělo být prostřednictvím označením zapečetěným modifikátorem zabráněno, aby byl použit jako základní typ.
CA1053: Statický vlastník typů by neměl mít konstruktory Veřejný nebo vnořený veřejný typ deklaruje pouze statické členy a má veřejný nebo chráněný výchozí konstruktor. Konstruktor není nutný, protože volání statických členů nevyžaduje instanci typu. Z důvodu bezpečnosti a zabezpečení by řetězcová přetížení měla volat přetížení identifikátoru URI použitím argumentu řetězce.
CA1054: Parametry identifikátoru URI by neměly být řetězce Pakliže metoda přijímá řetězcovou reprezentaci identifikátoru URI, mělo by být poskytnuto odpovídající přetížení přijímající instanci třídy URI, která tyto služby poskytuje bezpečným a zabezpečeným způsobem.
CA1055: Návratové hodnoty identifikátoru URI by neměly být řetězce Toto pravidlo předpokládá, že metoda vrací identifikátor URI. Řetězcová reprezentace identifikátoru URI je náchylná k chybám analýzy a kódování a může vést k ohrožení bezpečnosti. Třída System.Uri poskytuje tyto služby bezpečným a zabezpečeným způsobem.
CA1056: Vlastnosti identifikátoru URI by neměly být řetězce Toto pravidlo předpokládá, že vlastnost reprezentuje identifikátor URI. Řetězcová reprezentace identifikátoru URI je náchylná k chybám analýzy a kódování a může vést k ohrožení bezpečnosti. Třída System.Uri poskytuje tyto služby bezpečným a zabezpečeným způsobem.
CA1058: Typy by neměly rozšířit určité základní typy Externě viditelný typ rozšiřuje určité základní typy. Použijte jednu z alternativ.
CA1060: Přesuňte volání nespravovaných kódů do třídy NativeMethods Metody volání platformy, například metody označené atributem System.Runtime.InteropServices.DllImportAttribute nebo metody definované pomocí klíčového Declare slova v jazyce Visual Basic, mají přístup k nespravovanému kódu. Tyto metody by měly patřit třídě NativeMethods, SafeNativeMethods nebo UnsafeNativeMethods.
CA1061: Neskrývejte metody třídy base Metoda základního typu je skryta identicky pojmenovanou metodou v odvozeném typu, kde je předpis parametrů odvozené metody odlišný od odpovídajících typů v předpisu parametrů základní metody pouze ve slaběji odvozených typech.
CA1062: Ověřte argumenty veřejných metod Všechny argumenty odkazu předané externě viditelným metodám by měly být porovnány s hodnotou NULL.
CA1063: Implementuje správně IDisposable Všechny typy IDisposable by měly správně implementovat vzor Dispose.
CA1064: Výjimky by měly být veřejné Interní výjimka je viditelná pouze uvnitř svého vlastního vnitřního rozsahu. Jakmile výjimka přesáhne hranice vnitřního rozsahu, lze pro zachycení výjimky použít pouze základní výjimku. Pokud je vnitřní výjimka zděděna z Exception, SystemExceptionnebo ApplicationException, externí kód nebude mít dostatek informací vědět, co dělat s výjimkou.
CA1065: Nevyvolávejte výjimky v neočekávaných umístěních Metoda, u které není předpokládáno vyvolání výjimky, vyvolá výjimku.
CA1066: Implementace IEquatable při přepsání Equals Typ hodnoty přepíše Equals metodu, ale neimplementuje IEquatable<T>.
CA1067: Přepsání rovná se při implementaci IEquatable Typ implementuje IEquatable<T>, ale nepřepíše Equals metodu.
CA1068: Parametry CancellationToken musí být poslední Metoda má parametr CancellationToken, který není posledním parametrem.
CA1069: Výčty by neměly mít duplicitní hodnoty Výčet obsahuje více členů, kterým je explicitně přiřazena stejná konstantní hodnota.
CA1070: Deklarujte pole událostí jako virtuální Událost podobná poli byla deklarována jako virtuální.
CA1200: Vyhněte se používání značek cref s předponou Atribut cref ve značce dokumentace XML znamená "odkaz na kód". Určuje, že vnitřní text značky je prvek kódu, například typ, metoda nebo vlastnost. cref Nepoužívejte značky s předponami, protože brání kompilátoru v ověřování odkazů. Brání také integrovanému vývojovému prostředí (IDE) sady Visual Studio v hledání a aktualizaci těchto odkazů na symboly během refaktoringu.
CA1303: Nepředávejte literály jako lokalizované parametry Externě viditelná metoda předává řetězcový literál jako parametr konstruktoru nebo metodě .NET a tento řetězec by měl být lokalizovatelný.
CA1304: Zadejte možnosti CultureInfo Metoda nebo konstruktor volá člen, který má přetížení přijímající parametr System.Globalization.CultureInfo, a tato metoda nebo konstruktor nevolá přetížení přebírající parametr CultureInfo. Pokud objekt CultureInfo nebo System.IFormatProvider není zadán, nemusí mít výchozí hodnota zadaná pomocí přetíženého členu ve všech národních prostředích požadovaný efekt.
CA1305: Zadejte možnosti IFormatProvider Metoda nebo konstruktor volá jeden nebo více členů, které mají přetížení přijímající parametr System.IFormatProvider, a tato metoda nebo konstruktor nevolá přetížení, která přebírá parametr IFormatProvider. Pokud objekt System.Globalization.CultureInfo nebo IFormatProvider není zadán, nemusí mít výchozí hodnota zadaná pomocí přetíženého členu ve všech národních prostředích požadovaný efekt.
CA1307: Zadejte stringComparison pro srozumitelnost Operace porovnání řetězců používá přetížení metody, které nenastavuje parametr StringComparison.
CA1308: Normalizujte řetězce na velká písmena Řetězce by měly být normalizovány na velká písmena. Malá skupina znaků nedokáže po převodu na malá písmena provést zpáteční cestu.
CA1309: Použijte řadový StringComparison Nelingvistická operace porovnání řetězců nemá nastaven parametr StringComparison na hodnotu Ordinal ani na hodnotu OrdinalIgnoreCase. Explicitním nastavením parametru na hodnotu StringComparison.Ordinal nebo StringComparison.OrdinalIgnoreCase dojde ke zrychlení kódu a zvýšení přesnosti a spolehlivosti.
CA1310: Určení správnosti parametru StringComparison Operace porovnání řetězců používá přetížení metody, která nenastaví parametr StringComparison a ve výchozím nastavení používá porovnání řetězců specifických pro jazykovou verzi.
CA1311: Zadejte jazykovou verzi nebo použijte invariantní verzi Zadejte jazykovou verzi nebo použijte invariantní jazykovou verzi, aby se zabránilo implicitní závislosti na aktuální jazykové verzi při volání ToUpper nebo ToLower.
CA1401: Volání nespravovaných kódů by neměla být viditelná Veřejná nebo chráněná metoda ve veřejném typu má System.Runtime.InteropServices.DllImportAttribute atribut (také implementovaný klíčové slovo Declare v jazyce Visual Basic). Tyto metody by neměly být vystaveny.
CA1416: Ověření kompatibility platformy Použití rozhraní API závislých na platformě na komponentě už kód nebude fungovat na všech platformách.
CA1417: Nepoužívejte OutAttribute u parametrů řetězce pro volání nespravovaného kódu Řetězcové parametry předané hodnotou s OutAttribute můžou modul runtime stabilizovat, pokud je řetězec internedilovaným řetězcem.
CA1418: Použití platného řetězce platformy Analyzátor kompatibility platformy vyžaduje platný název a verzi platformy.
CA1419: Zadejte konstruktor bez parametrů, který je viditelný jako typ obsahující konkrétní typy odvozené od System.Runtime.InteropServices. Sejf Handle' Poskytnutí konstruktoru bez parametrů, který je viditelný jako typ obsahující typ odvozený z System.Runtime.InteropServices.SafeHandle povolení lepšího výkonu a použití se zdrojově generovanými řešeními vzájemné spolupráce.
CA1420: Vlastnost, typ nebo atribut vyžaduje zařazování za běhu Použití funkcí, které vyžadují zařazování za běhu při zakázání zařazování modulu runtime, způsobí výjimky za běhu.
CA1421: Metoda používá zařazování za běhu při použití DisableRuntimeMarshallingAttribute Metoda používá zařazování za běhu a zařazování za běhu je explicitně zakázáno.
CA1422: Ověření kompatibility platformy Volání rozhraní API zastaralého v daném operačním systému (verze) z webu volání, které je dostupné z tohoto operačního systému (verze), se nedoporučuje.
CA1501: Vyhněte se nadměrné dědičnosti Typ je více než čtyři úrovně hluboko v hierarchii dědičnosti. Hluboce vnořené hierarchie typů může být obtížné sledovat, pochopit a udržovat.
CA1502: Vyhněte se nadměrné složitosti Toto pravidlo měří počet lineárně nezávislých cest skrze metodu, což je určeno počtem a složitostí podmínkových větví.
CA1505: Vyhněte se neudržovatelnému kódu Typ nebo metoda má nízkou hodnotu indexu udržovatelnosti. Nízký index udržovatelnosti označuje, že typ nebo metodu je pravděpodobně obtížné udržovat a je vhodné ji znovu navrhnout.
CA1506: Vyhněte se nadměrnému párování tříd Toto pravidlo měří párování tříd podle počtu jedinečných odkazů na typ, které typ nebo metoda obsahuje.
CA1507: Místo řetězce použijte název nameof Řetězcový literál se používá jako argument, kde nameof lze použít výraz.
CA1508: Vyhněte se mrtvému podmíněnému kódu Metoda má podmíněný kód, který se vždy vyhodnotí za true běhu nebo false za běhu. To vede k mrtvému kódu ve false větvi podmínky.
CA1509: Neplatná položka v konfiguračním souboru metrik kódu Pravidla metrik kódu, například CA1501, CA1502, CA1505 a CA1506, zadali konfigurační soubor s názvemCodeMetricsConfig.txt, který má neplatnou položku.
CA1510: Použití pomocné rutiny ArgumentNullException Pomocné rutiny throw jsou jednodušší a efektivnější než if bloky, které vytváří novou instanci výjimky.
CA1511: Použití pomocné rutiny argumentException Pomocné rutiny throw jsou jednodušší a efektivnější než if bloky, které vytváří novou instanci výjimky.
CA1512: Použití pomocné rutiny ArgumentOutOfRangeException Pomocné rutiny throw jsou jednodušší a efektivnější než if bloky, které vytváří novou instanci výjimky.
CA1513: Použití pomocné rutiny ObjectDisposedException Pomocné rutiny throw jsou jednodušší a efektivnější než if bloky, které vytváří novou instanci výjimky.
CA1514: Vyhněte se argumentu redundantní délky Argument redundantní délky se používá při vytváření řezů na konec řetězce nebo vyrovnávací paměti. Počítaná délka může být náchylná k chybám a je také zbytečná.
CA1515: Zvažte interní vytváření veřejných typů Na rozdíl od knihovny tříd není rozhraní API aplikace obvykle veřejně odkazováno, takže typy je možné označit jako interní.
CA1700: Nepojmenovávejte výčty hodnot Reserved Toto pravidlo předpokládá, že člen výčtu, který má název obsahující výraz „reserved“, není aktuálně používán, ale je zástupným symbolem k přejmenování nebo odstranění v budoucí verzi. Přejmenování nebo odstranění členu je narušující změna.
CA1707: Identifikátory by neměly obsahovat podtržítka Názvy identifikátorů podle konvence neobsahují znak podtržítka (_). Toto pravidlo kontroluje obory názvů, typy, členy a parametry.
CA1708: Identifikátory by se měly lišit více než použitím malých a velkých písmen Identifikátory pro obory názvů, typy, členy a parametry nelze odlišit pouze ve velikosti písmen, protože jazyky cílené na modul CLR (Common Language Runtime) nemusí rozlišovat malá a velká písmena.
CA1710: Identifikátory by měly mít správnou příponu Podle konvence by měly názvy typů, které rozšiřují některé základní typy nebo určitá rozhraní, nebo typů odvozených z těchto typů mít příponu přidruženou těmto typům nebo rozhraním.
CA1711: Identifikátory by neměly mít nesprávnou příponu Pouze názvy typů, které rozšiřují určité základní typy nebo které implementují určitá rozhraní nebo typy, které jsou odvozeny z těchto typů, by podle konvence měly končit určitými vyhrazenými příponami. Jiné názvy typů by neměly používat tyto vyhrazené přípony.
CA1712: Nezačínejte hodnoty výčtu s názvem typu Názvy členů výčtu nemají předponu názvu typu, protože se očekává, že vývojové nástroje poskytují informace o typu.
CA1713: Události by neměly mít předponu před nebo po Název události začíná řetězcem „Before“ nebo „After“. Pro pojmenování souvisejících událostí vyvolaných v určitém pořadí je vhodné používat přítomný a minulý čas, který naznačí relativní pozici v pořadí akcí.
CA1714: Výčty příznaků by neměly mít názvy v množném čísle Veřejný výčet má atribut System.FlagsAttribute a jeho název nekončí písmenem „s“. Typy označené pomocí atributu FlagsAttribute mají názvy, které jsou v množném čísle, protože tento atribut označuje, že lze zadat více než jednu hodnotu.
CA1715: Identifikátory by měly mít správnou předponu Název externě viditelného rozhraní nezačíná velkým písmenem „I“. Název parametru obecného typu u externě viditelného typu nebo metody nezačíná velkým písmenem „T“.
CA1716: Identifikátory by neměly odpovídat klíčovým slovům Název oboru názvů nebo název typu odpovídá vyhrazenému klíčovému slovu programovacího jazyka. Identifikátory pro obory názvů a typů by neměly odpovídat klíčovým slovům, která jsou definována jazyky cílenými na modul CLR (Common Language Runtime).
CA1717: Pouze výčty FlagsAttribute by měly mít názvy v množném čísle Konvence pojmenování přikazují, aby název výčtu v množném čísle vyjadřoval, že lze současně zadat více než jednu hodnotu výčtu.
CA1720: Identifikátory by neměly obsahovat názvy typů Název parametru v externě viditelném členu obsahuje název datového typu nebo název externě viditelného členu obsahuje název datového typu specifický podle jazyka.
CA1721: Názvy vlastností by neměly odpovídat metodám Get Název soukromého nebo chráněného členu začíná na „Get“ a dále se shoduje s názvem veřejné nebo chráněné vlastnosti. Metody „Get“ a vlastnosti by měly mít názvy, které zřetelně rozliší jejich funkce.
CA1724: Názvy typů by neměly odpovídat oborům názvů Názvy typů by se neměly shodovat s názvy oborů názvů .NET. Porušení tohoto pravidla může snížit použitelnost knihovny.
CA1725: Názvy parametrů by měly odpovídat základní deklaraci Konzistentní pojmenování parametrů v hierarchii přetěžování zvyšuje použitelnost přetížení metody. Název parametru, který se v odvozené metodě liší od názvu v základní deklaraci, může způsobit zmatení, zda se u metody jedná o přepis základní metody, nebo o nové přetížení metody.
CA1727: Pro pojmenované zástupné symboly použijte PascalCase Pro pojmenované zástupné symboly v šabloně zprávy protokolování použijte PascalCase.
CA1801: Revize nepoužitých parametrů Podpis metody obsahuje parametr, který není použit v těle metody.
CA1802: Použijte literály, kde je to vhodné Pole je deklarováno jako statické a jen pro čtení (Shared a ReadOnly v jazyce Visual Basic) a inicializuje se pomocí hodnoty, která je v době kompilace kompuovatelná. Vzhledem k tomu, že hodnota přiřazená cílovému poli je v době kompilace kompuovatelná, změňte deklaraci na pole const (Const v jazyce Visual Basic), aby se hodnota vypočítávala v době kompilace místo v době běhu.
CA1805: Zbytečně neicializovat Modul runtime .NET inicializuje všechna pole referenčních typů na výchozí hodnoty před spuštěním konstruktoru. Ve většině případů je explicitně inicializace pole na výchozí hodnotu redundantní, což zvyšuje náklady na údržbu a může snížit výkon (například se zvýšenou velikostí sestavení).
CA1806: Neignorujte výsledky metody Nový objekt je vytvořen, ale nikdy se nepoužije, nebo je zavolána metoda, která vytvoří a vrátí nový řetězec a ten se nikdy nepoužije, nebo metoda modulu COM nebo P/Invoke vrací hodnotu HRESULT nebo kód chyby, který se nikdy nepoužije.
CA1810: Inicializujte odkazový typ statického pole vloženě Pokud typ deklaruje explicitní statický konstruktor, kompilátor just-in-time (JIT) ke každé statické metodě a konstruktoru instance tohoto typu přidá kontrolu, zda již byl dříve statický konstruktor zavolán. Kontroly statického konstruktoru mohou snížit výkon.
CA1812: Vyhněte se nevytvořeným instancím vnitřních tříd Instance typu na úrovni sestavení není vytvořena kódem v sestavení.
CA1813: Vyhněte se nezapečetěným atributům .NET poskytuje metody pro načítání vlastních atributů. Ve výchozím nastavení tyto metody prohledávají hierarchii dědičnosti atributů. Zapečetění atributu eliminuje prohledávání hierarchie dědičnosti a může zlepšit výkon.
CA1814: Preferujte vícenásobná pole více než multidimenzionální Vícenásobné pole je pole, jehož prvky jsou pole. Pole tvořící prvky mohou být různě velká, což vede k menšímu nevyužitému místu u některých sad dat.
CA1815: Přepište rovná se a operátor rovnosti na hodnotových typech Pro hodnotové typy používá zděděná implementace metody Equals knihovnu reflexe a porovnává obsah všech polí. Reflexe je výpočetně náročná a porovnání rovnosti všech polí může být zbytečné. Očekáváte-li, že uživatelé budou porovnávat nebo třídit instance či je používat jako klíče zatřiďovací tabulky, měl by typ hodnoty implementovat metodu Equals.
CA1816: Volejte správně GC.SuppressFinalize Metoda, která je implementace Dispose nevolá GC. SuppressFinalize; nebo metodu, která není implementací Dispose volání GC. SuppressFinalize; nebo metoda volá GC. SuppressFinalize a předává něco jiného než to (Já v jazyce Visual Basic).
CA1819: Vlastnosti by neměly vracet pole Pole vrácená vlastnostmi nejsou chráněna proti zápisu, i když je vlastnost jen pro čtení. Abyste pole ochránili před změnou, musí vlastnost vrátit kopii tohoto pole. Uživatelé obvykle nebudou rozumět nepříznivým výkonnostním důsledkům volání těchto vlastností.
CA1820: Testujte prázdné řetězce pomocí délky řetězce Porovnání řetězců pomocí vlastnosti String.Length nebo metody String.IsNullOrEmpty je výrazně rychlejší než při použití metody Equals.
CA1821: Odstraňte prázdné finalizační metody Kdykoli je to možné, vyhněte se použití finalizačních metod kvůli dodatečným nárokům na výkon spojeným se sledováním životního cyklu objektu. Prázdná finalizační metoda zvyšuje nároky a nemá žádný užitek.
CA1822: Označte členy jako statické Členy, kteří nepřistupují k datům instance nebo metodám volání instance, lze označit jako statické (sdílené v jazyce Visual Basic). Po označení metod jako statických bude kompilátor generovat těmto členům nevirtuální místa volání. Tím lze dosáhnout měřitelného zisku výkonu pro výkonově citlivý kód.
CA1823: Vyhněte se nepoužitým privátním polím Byla zjištěna soukromá pole, která v rámci sestavení zjevně nejsou přístupná.
CA1824: Označte sestavení pomocí atributu NeutralResourcesLanguageAttribute NeutralResourcesLanguage atribut informuje správce prostředků jazyka, který byl použit k zobrazení prostředků neutrální jazykové verze sestavení. To zlepšuje výkon vyhledávání při prvním získání prostředků a může zmenšit vaši pracovní sadu.
CA1825: Vyhněte se přidělování polí nulové délky Inicializace pole nulové délky vede k zbytečnému přidělení paměti. Místo toho použijte staticky přidělenou prázdnou instanci pole voláním Array.Empty. Přidělení paměti se sdílí napříč všemi vyvoláním této metody.
CA1826: Místo metody Linq Enumerable použijte vlastnost Enumerable Metoda LINQ byla použita u typu, který podporuje ekvivalentní, efektivnější vlastnost.
CA1827: Nepoužívejte Počet/LongCount, pokud lze použít libovolnou možnost Count nebo LongCount byla použita metoda, ve Any které by byla metoda efektivnější.
CA1828: Nepoužívejte CountAsync/LongCountAsync, pokud je možné použít AnyAsync CountAsync nebo LongCountAsync byla použita metoda, ve AnyAsync které by byla metoda efektivnější.
CA1829: Místo metody Enumerable.Count použijte vlastnost Length/Count. Count Metoda LINQ byla použita u typu, který podporuje ekvivalentní, efektivnější Length nebo Count vlastnost.
CA1830: Preferujte přetížení metody Append a Insert silného typu v StringBuilderu Append a Insert poskytují přetížení pro více typů nad rámec String. Pokud je to možné, upřednostněte přetížení silného typu před použitím ToString() a přetížení založené na řetězci.
CA1831: Místo indexerů založených na rozsahu použijte pro řetězec asSpan, pokud je to vhodné Při použití range-indexer v řetězci a implicitně přiřazení hodnoty k ReadOnlySpan<typu char> bude použita metoda Substring místo Slice, což vytvoří kopii požadované části řetězce.
CA1832: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole ReadOnlySpan nebo ReadOnlyMemory. Při použití indexeru rozsahu v matici a implicitně přiřazování hodnoty k ReadOnlySpan<T> nějakému typu ReadOnlyMemory<T> se použije metoda místo Slice, GetSubArray která vytvoří kopii požadované části pole.
CA1833: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole Span nebo Memory. Při použití indexeru rozsahu v matici a implicitně přiřazování hodnoty k Span<T> nějakému typu Memory<T> se použije metoda místo Slice, GetSubArray která vytvoří kopii požadované části pole.
CA1834: Pro řetězce s jedním znakem použijte StringBuilder.Append(char) StringBuilderAppend má přetížení, které jako argument přebíráchar. Preferujte volání char přetížení z důvodů výkonu.
CA1835: Preferujte přetížení založená na paměti pro ReadAsync a WriteAsync. Stream má přetížení ReadAsync, které jako první argument přebírá bajt> paměti<a přetížení WriteAsync, které jako první argument přebírá bajt ReadOnlyMemory<Byte>. Raději volají přetížení založená na paměti, což je efektivnější.
CA1836: Preferovat IsEmpty před Count dostupností Upřednostněte IsEmpty vlastnost, která je efektivnější než Count, Lengthnebo LongCount<TSource>(IEnumerable<TSource>) určit, Count<TSource>(IEnumerable<TSource>) zda objekt obsahuje nebo neobsahuje žádné položky.
CA1837: Používejte Environment.ProcessId místo Process.GetCurrentProcess().Id Environment.ProcessId je jednodušší a rychlejší než Process.GetCurrentProcess().Id.
CA1838: Vyhněte se StringBuilder parametrům volání nespravovaného kódu Přiřazování řetězce StringBuilder vždy vytvoří nativní kopii vyrovnávací paměti, což vede k několika přidělením pro jednu operaci zařazování.
CA1839: Místo Process.GetCurrentProcess() použijte Environment.ProcessPath. MainModule.FileName Environment.ProcessPath je jednodušší a rychlejší než Process.GetCurrentProcess().MainModule.FileName.
CA1840: Použijte Environment.CurrentManagedThreadId místo Thread.CurrentThread.ManagedThreadId. Environment.CurrentManagedThreadId je kompaktnější a efektivnější než Thread.CurrentThread.ManagedThreadId.
CA1841: Prefer Dictionary Contains metody Volání Contains na kolekci Keys nebo volání Values může být často dražší než volání ContainsKey nebo ContainsValue samotný slovník.
CA1842: Nepoužívejte funkci WhenAll s jedním úkolem Použití WhenAll s jednou úlohou může vést ke ztrátě výkonu. Nečekejte nebo vraťte úkol.
CA1843: Nepoužívejte waitAll s jednou úlohou Použití WaitAll s jednou úlohou může vést ke ztrátě výkonu. Nečekejte nebo vraťte úkol.
CA1844: Poskytnutí přepisů asynchronních metod založených na paměti při podtřídě Stream Pokud chcete zvýšit výkon, přepište asynchronní metody založené na paměti při podtřídě Stream. Pak implementujte metody založené na polích z hlediska metod založených na paměti.
CA1845: Použijte řetězec založený na rozsahu. Concat' Je efektivnější používat AsSpan a string.Concatmísto Substring operátor zřetězení.
CA1846: Raději než AsSpanSubstring AsSpan je efektivnější než Substring. Substring provádí kopii řetězce O(n), zatímco AsSpan ne a má konstantní náklady. AsSpan také neprovádí žádné přidělení haldy.
CA1847: Použití literálu char pro jednoznační vyhledávání Používejte string.Contains(char) místo string.Contains(string) při hledání jednoho znaku.
CA1848: Použijte delegáty LoggerMessage Pro zvýšení výkonu LoggerMessage použijte delegáty.
CA1849: Volání asynchronních metod v asynchronní metodě V metodě, která je již asynchronní, by volání jiných metod měla být jejich asynchronní verze, kde existují.
CA1850: Upřednostněte statickou HashData metodu před ComputeHash Je efektivnější použít statickou HashData metodu při vytváření a správě HashAlgorithm instance pro volání ComputeHash.
CA1851: Možné více výčtů IEnumerable kolekce Možné více výčtů IEnumerable kolekce. Zvažte použití implementace, která zabraňuje více výčtům.
CA1852: Zapečetění interních typů Typ, který není přístupný mimo sestavení a neobsahuje žádné podtypy v jeho obsahujícím sestavení, není zapečetěn.
CA1853: Nepotřebné volání Dictionary.ContainsKey(klíč) Není potřeba hlídat Dictionary.Remove(key)Dictionary.ContainsKey(key). Dictionary<TKey,TValue>.Remove(TKey) už zkontroluje, jestli klíč existuje, a pokud neexistuje, vyvolá se.
CA1854: Preferujte metodu IDictionary.TryGetValue(TKey, out TValue) Upřednostňujte hodnotu TryGetValue před indexerem slovníku, který je chráněný kontrolou ContainsKey. "ContainsKey" i indexer vyhledá klíč, takže použitím metody TryGetValue se vyhnete dalšímu vyhledávání.
CA1855: Použijte span<T>. Clear() místo span<T>. Fill() Volání je efektivnější než volání Span<T>.Clear()Span<T>.Fill(T) k vyplnění prvků rozsahu výchozí hodnotou.
CA1856: Nesprávné použití atributu ConstantExpected Atribut ConstantExpectedAttribute není u parametru použit správně.
CA1857: Parametr očekává konstantu pro optimální výkon. Neplatný argument se předá parametru, který je opatřen poznámkami ConstantExpectedAttribute.
CA1858: Místo IndexOf použijte StartsWith Volání je efektivnější než volání String.StartsWithString.IndexOf , abyste zkontrolovali, jestli řetězec začíná danou předponou.
CA1859: Pro zvýšení výkonu používejte konkrétní typy, pokud je to možné Kód používá typy rozhraní nebo abstraktní typy, což vede k zbytečným voláním rozhraní nebo virtuálním voláním.
CA1860: Nepoužívejte metodu rozšíření Enumerable.Any() Je efektivnější a jasnější použít Length, Countnebo IsEmpty (pokud je to možné) než volat Enumerable.Any , aby bylo možné určit, zda typ kolekce má nějaké prvky.
CA1861: Vyhněte se konstantním polím jako argumentům Konstantní pole předaná jako argumenty se znovu nepoužívají, což znamená režii na výkon. Pokud chcete zvýšit výkon, zvažte jejich extrahování do polí se statickým čtením.
CA1862: Použití přetížení metody StringComparison k provádění porovnání řetězců bez rozlišování velkých a malých písmen Při volání ToLower() kódu nebo ToUpper() provedení porovnání řetězců bez rozlišování velkých a malých písmen se provede zbytečné přidělení.
CA1863: Použijte CompositeFormat Chcete-li snížit náklady na formátování, mezipaměť a použít CompositeFormat instanci jako argument nebo String.FormatStringBuilder.AppendFormat.
CA1864: Preferujte metodu IDictionary.TryAdd(TKey, TValue) Obojí Dictionary<TKey,TValue>.ContainsKey(TKey) a Dictionary<TKey,TValue>.Add proveďte vyhledávání, které je redundantní. Volání je efektivnější Dictionary<TKey,TValue>.TryAdd, což vrátí bool indikující, jestli byla hodnota přidána nebo ne. TryAdd nepřepíše hodnotu klíče, pokud je klíč již k dispozici.
CA1865-CA1867: Použití přetížení char Přetížení znaku je lepším výkonem přetížení řetězce s jedním znakem.
CA1868: Nepotřebné volání "Contains" pro sady Obojí ISet<T>.Add(T) a ICollection<T>.Remove(T) proveďte vyhledávání, které předem zpřístupňuje volání ICollection<T>.Contains(T) . Volání nebo Remove(T) přímé volání Add(T) je efektivnější, což vrátí logickou hodnotu označující, jestli byla položka přidána nebo odebrána.
CA1869: Mezipaměti a opakované použití instancí JsonSerializerOptions Použití místní instance JsonSerializerOptions serializace nebo deserializace může podstatně snížit výkon vaší aplikace, pokud se váš kód spustí vícekrát, protože System.Text.Json interně ukládá metadata související se serializací do zadané instance.
CA1870: Použití instance SearchValues uložené v mezipaměti Použití instance uložené SearchValues<T> v mezipaměti je efektivnější než přímé předávání hodnot do indexOfAny nebo ContainsAny.
CA1871: Nepředávejte strukturu s možnou hodnotou null do argumentu ArgumentNullException.ThrowIfNull ArgumentNullException.ThrowIfNull přijímá objekt object, takže předání struktury s možnou hodnotou null může způsobit, že se hodnota zařadí do pole.
CA1872: Upřednostněte convert.ToHexString a Convert.ToHexStringLower u řetězců volání založených na BitConverter.ToString Použijte Convert.ToHexString nebo Convert.ToHexStringLower při kódování bajtů na šestnáctkové řetězcové vyjádření. Tyto metody jsou efektivnější a přívětivější než použití BitConverter.ToString v kombinaci s String.Replace nahrazením pomlček a String.ToLower.
CA2000: Uvolňujte objekty před ztrátou oboru Protože může dojít k mimořádné události, která zabrání spuštění destruktoru objektu, měl by být objekt explicitně uvolněn předtím, než se všechny odkazy na něj dostanou mimo rozsah.
CA2002: Nepoužívejte zámky na objekty se slabou identitou Objekt má slabou identitu, pokud k němu lze přímo přistupovat přes hranice aplikační domény. Vlákno, které se pokouší získat zámek na objekt se slabou identitou, může být blokováno jiným vláknem v jiné aplikační doméně, které má zámek na stejný objekt.
CA2007: Nečekejte přímo na úkol Asynchronní metoda čekáTask přímo. Když asynchronní metoda čeká Task přímo, pokračování probíhá ve stejném vlákně, které vytvořilo úlohu. Toto chování může být nákladné z hlediska výkonu a může vést k zablokování ve vlákně uživatelského rozhraní. Zvažte volání Task.ConfigureAwait(Boolean) , které bude signalizovat váš záměr pokračování.
CA2008: Nevytvářejte úkoly bez předání taskScheduler Operace vytvoření nebo pokračování úlohy používá přetížení metody, které neurčovalo TaskScheduler parametr.
CA2009: Nevolejte ToImmutableCollection u hodnoty ImmutableCollection ToImmutable metoda byla zbytečně volána v neměnné kolekci z System.Collections.Immutable oboru názvů.
CA2011: Nepřiřazovat vlastnost v rámci jeho setter Vlastnost byla omylem přiřazena hodnota v rámci svého vlastního přístupového objektu sady.
CA2012: Správné použití hodnotových hodnot HodnotaTasks vrácená z volání členů je určena k přímému očekávání. Pokusy o vícenásobné využití hodnoty ValueTask nebo přímý přístup k výsledku jednoho z nich před tím, než je známo, že je dokončeno, může vést k výjimce nebo poškození. Ignorování takové hodnoty ValueTask pravděpodobně značí funkční chybu a může snížit výkon.
CA2013: Nepoužívejte referenceEquals s typy hodnot Při porovnávání hodnot pomocí System.Object.ReferenceEquals, pokud objA a objB jsou typy hodnot, jsou boxovány před jejich předáním metodě ReferenceEquals . To znamená, že i když objA i objB představují stejnou instanci typu hodnoty, ReferenceEquals metoda přesto vrátí false.
CA2014: Nepoužívejte ve smyčce stackalloc. Prostor zásobníku přidělený stackallocem se uvolní pouze na konci volání aktuální metody. Použití ve smyčce může vést k nevázaným růstem zásobníku a případným podmínkám přetečení zásobníku.
CA2015: Nedefinujte finalizační metody pro typy odvozené z memoryManager<T> Přidání finalizátoru do typu odvozeného z MemoryManager<T> může umožnit uvolnění paměti, zatímco je stále používána Span<T>.
CA2016: Předání parametru CancellationToken metodám, které berou jeden CancellationToken Předejte parametr metodám, které ho převedou, aby se zajistilo, že se oznámení o zrušení operace správně rozšíří, nebo CancellationToken.None předat explicitně, aby indikovala úmyslně nerozšíření tokenu.
CA2017: Neshoda počtu parametrů Počet parametrů zadaných v šabloně zprávy protokolování neodpovídá počtu pojmenovaných zástupných symbolů.
CA2018: Argument count , který má Buffer.BlockCopy určovat počet bajtů ke zkopírování Při použití Buffer.BlockCopycount argument určuje počet bajtů, které se mají zkopírovat. Pro argumenty byste měli použít Array.Lengthcount pouze pole, jejichž prvky jsou přesně jeden bajt ve velikosti. byte, sbytea bool pole obsahují prvky, které mají velikost jednoho bajtu.
CA2019: ThreadStatic Pole by neměla používat vložené inicializace Pole s poznámkami ThreadStaticAttribute je inicializováno vloženým nebo explicitně v konstruktoru static (Shared v jazyce Visual Basic).
CA2020: Zabránění změnám chování způsobeným integrovanými operátory IntPtr/UIntPtr Některé předdefinované operátory přidané v .NET 7 se chovají jinak než uživatelem definované operátory v .NET 6 a starších verzích. Některé operátory, které se použily k vyvolání nezaškrtnutého kontextu při přetečení, se už nevyvolají, pokud nejsou zabalené v rámci kontrolovaného kontextu. Některé operátory, které dříve nevyvolaly vrácený kontrolovaný kontext, nyní vyvolány, pokud nejsou zabaleny v nezaškrtnutém kontextu.
CA2021: Nevolejte Enumerable.Cast<T> nebo Enumerable.OfType<T> s nekompatibilními typy Volání Enumerable.Cast<TResult>(IEnumerable) nebo Enumerable.OfType<TResult>(IEnumerable) určuje parametr typu, který není kompatibilní s typem vstupní kolekce.
CA2100: Revize dotazů SQL pro chyby zabezpečení Metoda nastavuje vlastnost System.Data.IDbCommand.CommandText pomocí řetězce, který je sestaven z řetězcového argumentu k metodě. Toto pravidlo předpokládá, že řetězcový argument obsahuje vstup uživatele. Řetězec příkazu SQL sestavený ze vstupu uživatele je ohrožen útoky prostřednictvím injektáže SQL.
CA2101: Určení zařazování pro argumenty řetězce volání nespravovaného kódu Člen vyvolání platformy povoluje částečně důvěryhodné volající, má řetězcový parametr a explicitně nezařazuje řetězec. To může způsobit potenciální ohrožení zabezpečení.
CA2109: Revize viditelných obslužných rutin událostí Byla zjištěna veřejná nebo chráněná metoda zpracování událostí. Metody zpracování událostí by neměly být vystaveny, pokud to není nezbytně nutné.
CA2119: Zapečeťte metody, které vyhovují privátním rozhraním Zděděný veřejný typ poskytuje přepisovatelnou implementaci metody interního rozhraní (Friend v jazyce Visual Basic). Chcete-li opravit porušení tohoto pravidla, zabraňte přepsání metody mimo sestavení.
CA2153: Vyhněte se zpracování výjimek poškozeného stavu Výjimky poškozeného stavu (CSE) označují, že v procesu existuje poškození paměti. Zachytávání těchto chyb místo toho, aby umožňovalo chybové ukončení procesu, může vést k ohrožením zabezpečení, pokud útočník může zneužití umístit do poškozené oblasti paměti.
CA2200: Znovu vyvolejte pro zachování podrobností zásobníku Výjimka je znovu vyvolána a je jednoznačně uvedena v příkazu throw. Jestliže je výjimka znovu vyvolána zadáním výjimky v příkazu throw, seznam volání metody mezi původní metodou, která vyvolala výjimku, a aktuální metodou je ztracen.
CA2201: Nevyvolávejte vyhrazené typy výjimek Díky tomu je obtížné rozpoznat a ladit původní chybu.
CA2207: Inicializujte vloženou hodnotu statických polí Hodnotový typ deklaruje explicitní statický konstruktor. Chcete-li opravit porušení tohoto pravidla, inicializujte všechna statická data při deklaraci a statický konstruktor odeberte.
CA2208: Vytvořte správně instance výjimky argumentu Volání výchozího konstruktoru (bez parametrů) typu výjimky, který je nebo je odvozen od ArgumentException, nebo je předán nesprávný řetězcový argument parametrizovaný konstruktor typu výjimky, který je nebo je odvozen z ArgumentException.
CA2211: Nekonstantní pole by nemělo být viditelné Statická pole, která nejsou konstantami ani nejsou jen pro čtení, nejsou bezpečná pro přístup z více vláken. Přístup k takovému poli musí být pečlivě kontrolován a vyžaduje pokročilé programovací techniky pro synchronizaci přístupu k objektu třídy.
CA2213: Uvolnitelné pole by mělo být uvolněno Typ implementující rozhraní System.IDisposable deklaruje typy polí, které také implementují rozhraní IDisposable. Metoda pole Dispose není volána pomocí metody Dispose deklarujícího typu.
CA2214: Nevolejte přepisovatelné metody v konstruktorech Když konstruktor volá virtuální metodu, konstruktor instance, která vyvolá metodu, nemusí být spuštěna.
CA2215: Metody Dispose by měly volat uvolnění třídy Base Pokud typ dědí z uvolnitelného typu, musí volat metodu Dispose ze základního typu v rámci své vlastní metody Dispose.
CA2216: Uvolnitelné typy by měly deklarovat finalizační metodu Typ, který implementuje rozhraní System.IDisposable a obsahuje pole, která navrhují použití nespravovaných prostředků, neimplementuje finalizační metodu, jak je popsáno metodou Object.Finalize.
CA2217: Neoznačujte výčty pomocí FlagsAttribute Externě viditelný výčet je označen atributem FlagsAttribute a má jednu nebo více hodnot, které nejsou mocninami dvou nebo kombinací jiných definovaných hodnot výčtu.
CA2218: Přepište GetHashCode při přepsání Equals Veřejný typ přepisuje System.Object.Equals , ale nepřepíše System.Object.GetHashCode.
CA2219: Nevyvolávejte výjimky v klauzulích výjimky Když je výjimka vyvolána v klauzuli finally nebo fault, je případná aktivní výjimka překryta novou výjimkou. Při vyvolání výjimky v klauzuli filtru modul runtime bezobslužně zachytí výjimku. Díky tomu je obtížné rozpoznat a ladit původní chybu.
CA2224: Přepište Equals při přetížení operátoru rovnosti Veřejný typ implementuje operátor rovnosti, ale nepřepíše System.Object.Equals.
CA2225: Přetížení operátoru mají pojmenované alternativy Bylo zjištěno přetížení operátoru a alternativní metoda s očekávaným názvem nebyla nalezena. Pojmenovaný alternativní člen poskytuje přístup ke stejným funkcím jako operátor a je k dispozici pro vývojáře, kteří programují v jazycích nepodporujících přetížené operátory.
CA2226: Operátory by měly mít symetrické přetížení Typ implementuje operátor rovnosti nebo nerovnosti a neimplementuje opačný operátor.
CA2227: Vlastnosti kolekce by měly být pouze pro čtení Zapisovatelná vlastnost kolekce umožňuje uživateli nahradit kolekci jinou kolekcí. Vlastnost jen pro čtení neumožňuje kolekci nahradit, ale stále umožňuje nastavit jednotlivé členy.
CA2229: Implementovat serializační konstruktory Implementací konstruktoru serializace se vyřeší porušení tohoto pravidla. Pro zapečetěnou třídu musí být konstruktor soukromý. V ostatních případech musí být chráněný.
CA2231: Přetižte operátor equals při přepsání ValueType.Equals Hodnotový typ přepisuje metodu Object.Equals, ale neimplementuje operátor rovnosti.
CA2234: Předejte objekty System.Uri namísto řetězců Je provedeno volání metody, která má řetězcový parametr, jehož název obsahuje „uri“, „URI“, „urn“, „URN“, „url“ nebo „URL“. Typ deklarující metodu obsahuje odpovídající přetížení metody, která má parametr typu System.Uri.
CA2235: Označte všechna neserializovatelná pole Neserializovatelný typ pole instance je deklarován v serializovatelném typu.
CA2237: Označte typy ISerializable pomocí SerializableAttribute Aby byl typ rozpoznán modulem CLR (Common Language Runtime) jako serializovatelný, musí být označen pomocí atributu SerializableAttribute, i když typ používá vlastní rutinu serializace prostřednictvím implementace rozhraní ISerializable.
CA2241: Poskytněte správné argumenty metodě formátování Formátovací argument, který je předán metodě System.String.Format, neobsahuje formátovací položku, která odpovídá každému argumentu objektu nebo naopak.
CA2242: Testujte správně NaN Tento výraz testuje hodnotu proti metodě Single.Nan nebo Double.Nan. Chcete-li tuto hodnotu otestovat, použijte metodu Single.IsNan(Single) nebo Double.IsNan(Double).
CA2243: Literály řetězce atributu by se měly správně analyzovat Parametr řetězcového literálu atributu nesprávně analyzuje adresu URL, identifikátor GUID nebo verzi.
CA2244: Neduplikujte inicializace indexovaných prvků Inicializátor objektů má více než jeden inicializátor indexovaného prvku se stejným konstantním indexem. Všechny kromě posledního inicializátoru jsou redundantní.
CA2245: Nepřiřazujte vlastnost sama sobě Vlastnost byla omylem přiřazena sama sobě.
CA2246: Nepřiřazujte symbol a jeho člena ve stejném příkazu Přiřazení symbolu a jeho člena, tj. pole nebo vlastnosti, ve stejném příkazu se nedoporučuje. Není jasné, jestli byl přístup člena zamýšlen k použití staré hodnoty symbolu před přiřazením nebo novou hodnotou z přiřazení v tomto příkazu.
CA2247: Argument předaný Konstruktor TaskCompletionSource by měl být TaskCreationOptions výčtu místo TaskContinuationOptions výčtu. TaskCompletionSource má konstruktory, které přebírají TaskCreationOptions, které řídí základní úkol, a konstruktory, které přebírají stav objektu, který je uložen v úkolu. Náhodné předání TaskContinuationOptions místo TaskCreationOptions způsobí, že volání považuje možnosti za stav.
CA2248: Zadejte správný argument výčtu enum enum.HasFlag Typ výčtu předaný jako argument volání HasFlag metody se liší od typu volání výčtu.
CA2249: Zvažte použití string.Contains místo String.IndexOf Volání místa string.IndexOf , kde se výsledek používá ke kontrole přítomnosti nebo nepřítomnosti podřetětědce, lze nahradit string.Contains.
CA2250: Použití ThrowIfCancellationRequested ThrowIfCancellationRequested automaticky zkontroluje, jestli byl token zrušen, a vyvolá OperationCanceledException výjimku, pokud má.
CA2251: Používejte String.EqualsString.Compare Místo porovnání výsledku String.Compare s nulou je to jasnější a pravděpodobně rychlejšíString.Equals.
CA2252: Výslovný souhlas s funkcemi ve verzi Preview Před použitím rozhraní API verze Preview se přihlaste k funkcím ve verzi Preview.
CA2253: Pojmenované zástupné symboly by neměly být číselné hodnoty Pojmenované zástupné symboly v šabloně zprávy protokolování by se neměly skládat pouze z číselných znaků.
CA2254: Šablona by měla být statický výraz Šablona zprávy protokolování by se neměla mezi voláními lišit.
CA2255: Atribut ModuleInitializer by neměl být použit v knihovnách Inicializátory modulů jsou určeny k použití kódu aplikace k zajištění inicializace komponent aplikace před zahájením provádění kódu aplikace.
CA2256: Všichni členové deklarovaní v nadřazených rozhraních musí mít implementaci v dynamicInterfaceCastableImplementation-attributed rozhraní Typy atributy, které DynamicInterfaceCastableImplementationAttribute fungují jako implementace rozhraní pro typ, který implementuje IDynamicInterfaceCastable typ. V důsledku toho musí poskytnout implementaci všech členů definovaných v zděděných rozhraních, protože typ, který implementuje IDynamicInterfaceCastable , je jinak nezadá.
CA2257: Členy definované v rozhraní s dynamicInterfaceCastableImplementationAttribute by měly být statické. Vzhledem k tomu, že typ, který implementuje IDynamicInterfaceCastable , nemusí implementovat dynamické rozhraní v metadatech, volání člena rozhraní instance, který není explicitní implementace definovaná na tomto typu, pravděpodobně selžou za běhu. Označte nové členy static rozhraní, aby nedocházelo k chybám za běhu.
CA2258: Poskytnutí rozhraní DynamicInterfaceCastableImplementation v jazyce Visual Basic není podporováno Poskytnutí funkčního DynamicInterfaceCastableImplementationAttributerozhraní atributu -attributed vyžaduje funkci Výchozí členy rozhraní, která není podporována v jazyce Visual Basic.
CA2259: Ujistěte se, že ThreadStatic se používá jenom se statickými poli ThreadStaticAttributestatic ovlivňuje pouze pole (Sharedv jazyce Visual Basic). Při použití u polí instance nemá atribut žádný vliv na chování.
CA2260: Správně implementujte obecná matematická rozhraní Obecná matematická rozhraní vyžadují, aby byl odvozený typ použit pro parametr samoopakujícího typu.
CA2261: Nepoužívejte ConfigureAwaitOptions.SuppressThrowing s Task<TResult> Obecná ConfigureAwaitOptions.SuppressThrowing možnost nepodporuje Task<TResult>, protože to může vést k vrácení neplatného TResultkódu .
CA2262: Správně nastavte MaxResponseHeadersLength Ujistěte se, MaxResponseHeadersLength že je hodnota zadaná správně. Tato hodnota se měří v kilobajtech.
CA2263: Preferujte obecné přetížení, pokud je typ známý Použití obecného přetížení je vhodnější pro předání argumentu System.Type , pokud je typ známý, protože propagují čistější a bezpečnější kód s vylepšenými kontrolami doby kompilace.
CA2264: Nepředávejte nenulnutelnou hodnotu argumentu ArgumentNullException.ThrowIfNull ArgumentNullException.ThrowIfNull vyvolá, když je předaný argument null. Některé konstrukty, jako jsou struktury bez hodnoty null, a výrazy nameof() a new nejsou nikdy null, takže ArgumentNullException.ThrowIfNull nikdy nevyvolá výjimku.
CA2300: Nepoužívejte nezabezpečený deserializátor BinaryFormatter Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2301: Nevolejte BinaryFormatter.Deserialize bez prvního nastavení BinaryFormatter.Binder Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2302: Před voláním BinaryFormatter.Deserialize se ujistěte, že je nastaven binaryFormatter.Binder Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2305: Nepoužívejte nezabezpečený deserializátor LosFormatter Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2310: Nepoužívejte nezabezpečený deserializátor NetDataContractSerializer Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2311: Ne deserializovat bez prvního nastavení NetDataContractSerializer.Binder Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2312: Před deserializací se ujistěte, že je nastavená vlastnost NetDataContractSerializer.Binder Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2315: Nepoužívejte nezabezpečený deserializátor ObjectStateFormatter Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2321: Ne deserializovat pomocí JavaScriptSerializer pomocí SimpleTypeResolver Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2322: Před deserializací se ujistěte, že JavaScriptSerializer není inicializován pomocí metody SimpleTypeResolver. Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2326: Nepoužívejte jiné hodnoty TypeNameHandling než None Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2327: Nepoužívejte nezabezpečený JsonSerializer Nastavení Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2328: Ujistěte se, že je zabezpečený jsonSerializer Nastavení Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2329: Ne deserializovat pomocí JsonSerializer pomocí nezabezpečené konfigurace Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2330: Ujistěte se, že má jsonSerializer při deserializaci zabezpečenou konfiguraci. Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky.
CA2350: Ujistěte se, že vstup DataTable.ReadXml() je důvěryhodný. Při deserializaci nedůvěryhodného DataTable vstupu může útočník vytvořit škodlivý vstup, který provede útok do služby dos. Může se jednat o neznámá ohrožení zabezpečení vzdáleného spuštění kódu.
CA2351: Ujistěte se, že vstup DataSet.ReadXml() je důvěryhodný. Při deserializaci nedůvěryhodného DataSet vstupu může útočník vytvořit škodlivý vstup, který provede útok do služby dos. Může se jednat o neznámá ohrožení zabezpečení vzdáleného spuštění kódu.
CA2352: Nebezpečné datové sady nebo datové tabulky v serializovatelném typu mohou být ohroženy útoky vzdáleného spuštění kódu Třída nebo struktura označená SerializableAttribute pomocí obsahuje DataSet nebo DataTable pole nebo vlastnost a nemá GeneratedCodeAttributehodnotu .
CA2353: Nezabezpečená datová sada nebo datová tabulka v serializovatelném typu Třída nebo struktura označená atributem serializace XML nebo atribut kontraktu dat obsahuje DataSet nebo DataTable pole nebo vlastnost.
CA2354: Nezabezpečená datová sada nebo datová tabulka v deserializovaném grafu objektů může být zranitelná vůči útokům vzdáleného spuštění kódu. Deserializace serializovaným objektem System.Runtime.Serialization.IFormatter a graf objektu přetypovaného typu může obsahovat nebo DataSetDataTable.
CA2355: Nezabezpečená datová sada nebo datová tabulka v deserializovaném grafu objektu Deserializace, pokud přetypovaný nebo zadaný typ objektový graf může obsahovat nebo DataSetDataTable.
CA2356: Nezabezpečená datová sada nebo datová tabulka v grafu deserializovaného objektu webu Metoda s System.Web.Services.WebMethodAttribute nebo má parametr, který může odkazovat na nebo DataSetDataTable.System.ServiceModel.OperationContractAttribute
CA2361: Ujistěte se, že se u nedůvěryhodných dat nepoužívá automaticky vygenerovaná třída obsahující DataSet.ReadXml(). Při deserializaci nedůvěryhodného DataSet vstupu může útočník vytvořit škodlivý vstup, který provede útok do služby dos. Může se jednat o neznámá ohrožení zabezpečení vzdáleného spuštění kódu.
CA2362: Nebezpečná datová sada nebo datová tabulka v automaticky generovaném serializovatelném typu může být zranitelná vůči útokům vzdáleného spuštění kódu Při deserializaci nedůvěryhodného vstupu s grafem BinaryFormatter deserializovaného objektu nebo DataTableDataSet nebo může útočník vytvořit škodlivou datovou část pro provedení vzdáleného útoku na spuštění kódu.
CA3001: Zkontrolujte ohrožení zabezpečení injektáží SQL v kódu Při práci s nedůvěryhodnými vstupy a příkazy SQL mějte na paměti útoky prostřednictvím injektáže SQL. Útok prostřednictvím injektáže SQL může spouštět škodlivé příkazy SQL a ohrozit zabezpečení a integritu vaší aplikace.
CA3002: Kontrola ohrožení zabezpečení XSS v kódu Při práci s nedůvěryhodným vstupem z webových požadavků mějte na paměti útoky na skriptování mezi weby (XSS). Útok XSS vloží nedůvěryhodný vstup do nezpracovaného výstupu HTML, což útočníkovi umožní spouštět škodlivé skripty nebo škodlivé úpravy obsahu na webové stránce.
CA3003: Zkontrolujte ohrožení zabezpečení injektáží cesty k souboru v kódu Při práci s nedůvěryhodným vstupem z webových požadavků mějte na paměti použití uživatelem řízeného vstupu při zadávání cest k souborům.
CA3004: Zkontrolujte ohrožení zabezpečení spočívající ve zpřístupnění informací v kódu. Informace o výjimce poskytují útočníkům přehled o vnitřních informacích vaší aplikace, které můžou útočníkům pomoct najít další ohrožení zabezpečení, která by bylo možné zneužít.
CA3005: Zkontrolujte ohrožení zabezpečení injektáže PROTOKOLU LDAP v kódu Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže protokolu LDAP (Lightweight Directory Access Protocol). Útočník může potenciálně spouštět škodlivé příkazy LDAP proti adresářům informací. Aplikace, které používají uživatelský vstup k vytváření dynamických příkazů LDAP pro přístup k adresářovým službám, jsou obzvláště zranitelné.
CA3006: Zkontrolujte ohrožení zabezpečení injektáže příkazů procesu v kódu Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže příkazů. Útok prostřednictvím injektáže příkazů může spouštět škodlivé příkazy v základním operačním systému a ohrozit zabezpečení a integritu vašeho serveru.
CA3007: Zkontrolujte ohrožení zabezpečení otevřeného přesměrování v kódu Při práci s nedůvěryhodným vstupem mějte na paměti ohrožení zabezpečení otevřeného přesměrování. Útočník může zneužít ohrožení zabezpečení otevřeného přesměrování k použití vašeho webu k poskytnutí vzhledu legitimní adresy URL, ale přesměrovat nespektujícího návštěvníka na útok phishing nebo jinou škodlivou webovou stránku.
CA3008: Zkontrolujte ohrožení zabezpečení injektáže XPath v kódu Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže XPath. Vytváření dotazů XPath pomocí nedůvěryhodného vstupu může útočníkovi umožnit škodlivé manipulaci s dotazem, aby vrátil nezamýšlený výsledek a mohl by zpřístupnit obsah dotazovaného XML.
CA3009: Zkontrolujte ohrožení zabezpečení injektáží XML v kódu Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže XML.
CA3010: Kontrola ohrožení zabezpečení injektáží XAML v kódu Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže XAML. XAML je jazyk využívající značky, který přímo reprezentuje vytváření instancí objektů a jejich spouštění. To znamená, že prvky vytvořené v XAML můžou pracovat se systémovými prostředky (například síťový přístup a vstupně-výstupní operace systému souborů).
CA3011: Zkontrolujte ohrožení zabezpečení injektáží knihovny DLL v kódu Při práci s nedůvěryhodným vstupem mějte na paměti načtení nedůvěryhodného kódu. Pokud webová aplikace načte nedůvěryhodný kód, útočník může do procesu vložit škodlivé knihovny DLL a spustit škodlivý kód.
CA3012: Zkontrolujte ohrožení zabezpečení injektáží regulárních výrazů v kódu Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže regulárních výrazů. Útočník může použít injektáž regulárního výrazu ke škodlivé úpravě regulárního výrazu, k tomu, aby regulární výraz odpovídal nezamýšleným výsledkům nebo aby regulární výraz spotřeboval nadměrné využití procesoru, což vede k útoku do odepření služby.
CA3061: Nepřidávejte schéma podle adresy URL Nepoužívejte nebezpečné přetížení metody Add, protože by mohlo způsobit nebezpečné externí odkazy.
CA3075: Zpracování nezabezpečené specifikace DTD Pokud používáte nezabezpečené instance DTDProcessing nebo odkazujete na externí zdroje entit, analyzátor může přijmout nedůvěryhodný vstup a zveřejnit citlivé informace útočníkům.
CA3076: Spuštění nezabezpečeného skriptu XSLT Pokud v aplikacích .NET spustíte nezabezpečené transformace jazyka XSLT (Extensible Stylesheet Language Transformations), může procesor vyřešit nedůvěryhodné odkazy URI, které by mohly útočníkům zpřístupnit citlivé informace, což vede k útokům typu Denial of Service a Cross-Site.
CA3077: Nezabezpečené zpracování v návrhu rozhraní API, dokumentu XML a čtečce textu XML Při navrhování rozhraní API odvozeného z XMLDocument a XMLTextReader mějte na paměti DtdProcessing. Použití nezabezpečených instancí DTDProcessing při odkazování nebo překladu externích zdrojů entit nebo nastavení nezabezpečených hodnot v XML může vést ke zpřístupnění informací.
CA3147: Označte obslužné rutiny příkazů pomocí ValidateAntiForgeryToken Při návrhu kontroleru ASP.NET MVC mějte na paměti útoky typu útok na negery mezi weby. Útok na padělání požadavků mezi weby může posílat škodlivé požadavky ověřeného uživatele do kontroleru ASP.NET MVC.
CA5350: Nepoužívejte slabé kryptografické algoritmy Slabé šifrovací algoritmy a funkce hash se dnes používají z mnoha důvodů, ale neměly by se používat k zajištění důvěrnosti nebo integrity dat, která chrání. Toto pravidlo se aktivuje, když najde algoritmy TripleDES, SHA1 nebo RIPEMD160 v kódu.
CA5351: Nepoužívejte poškozené kryptografické algoritmy Poškozené kryptografické algoritmy se nepovažují za bezpečné a jejich použití by se mělo důrazně nedoporučuje. Toto pravidlo se aktivuje, když najde algoritmus hash MD5 nebo šifrovací algoritmy DES nebo RC2 v kódu.
CA5358: Nepoužívejte nebezpečné režimy šifry Nepoužívat nezabezpečené režimy šifrování
CA5359: Nezakazujte ověření certifikátu Certifikát může pomoct s ověřením identity serveru. Klienti by měli ověřit certifikát serveru, aby se zajistilo, že se požadavky posílají na zamýšlený server. Pokud ServerCertificateValidationCallback vždy vrátí true, všechny certifikáty projdou ověřením.
CA5360: Nevolejte nebezpečné metody při deserializaci Nezabezpečená deserializace je ohrožení zabezpečení, ke kterému dochází v případě, že se nedůvěryhodná data používají ke zneužití logiky aplikace, způsobí útok DoS (Denial-of-Service) nebo dokonce spustí libovolný kód při deserializaci. Uživatelům se zlými úmysly je často možné zneužít tyto funkce deserializace, když aplikace deserializuje nedůvěryhodná data, která jsou pod jejich kontrolou. Konkrétně vyvolat nebezpečné metody v procesu deserializace. Úspěšné nezabezpečené útoky deserializace by mohly útočníkovi umožnit provádět útoky, jako jsou útoky DoS, obtékání ověřování a vzdálené spuštění kódu.
CA5361: Nezakazujte použití Schannel silného kryptografie Nastavení Switch.System.Net.DontEnableSchUseStrongCrypto pro true oslabování kryptografie používané v odchozích připojeních TLS (Transport Layer Security). Slabší kryptografie může ohrozit důvěrnost komunikace mezi vaší aplikací a serverem, což útočníkům usnadňuje odposlouchvání citlivých dat.
CA5362: Potenciální referenční cyklus v deserializovaném grafu objektů Pokud deserializace nedůvěryhodných dat, jakýkoli kód zpracovávající deserializovaný objektový graf musí zpracovávat referenční cykly bez nutnosti přecházet do nekonečných smyček. To zahrnuje jak kód, který je součástí zpětného volání deserializace, tak kód, který zpracovává graf objektu po dokončení deserializace. Jinak by útočník mohl provést útok do služby se zlými daty obsahujícími referenční cyklus.
CA5363: Nezakazujte ověření požadavku Ověření požadavku je funkce v ASP.NET, která zkoumá požadavky HTTP a určuje, jestli obsahují potenciálně nebezpečný obsah, který může vést k útokům prostřednictvím injektáže, včetně skriptování mezi weby.
CA5364: Nepoužívejte zastaralé protokoly zabezpečení Protokol TLS (Transport Layer Security) zabezpečuje komunikaci mezi počítači, nejčastěji s protokolem HTTPS (Hypertext Transfer Protocol Secure). Starší verze protokolu TLS jsou méně zabezpečené než protokoly TLS 1.2 a TLS 1.3 a s větší pravděpodobností mají nová ohrožení zabezpečení. Vyhněte se starším verzím protokolu, abyste minimalizovali riziko.
CA5365: Nezakazujte kontrolu hlaviček HTTP Kontrola hlaviček HTTP umožňuje kódování návratových znaků na začátek řádku a znak nového řádku \r a \n, které jsou nalezeny v hlavičce odpovědi. Toto kódování může pomoct vyhnout se útokům prostřednictvím injektáže, které zneužívají aplikaci, která odráží nedůvěryhodná data obsažená v hlavičce.
CA5366: Použití Třídy XmlReader pro čtení XML datové sady DataSet Použití ke čtení XML s nedůvěryhodnými daty může načíst nebezpečné externí odkazy, které by měly být omezeny pomocí XmlReader zabezpečeného překladače nebo se zakázaným zpracováním DTD.
CA5367: Ne serializovat typy s poli ukazatele Toto pravidlo zkontroluje, zda existuje serializovatelná třída s polem ukazatele nebo vlastností. Členy, které nelze serializovat, mohou být ukazatel, například statické členy nebo pole označená NonSerializedAttribute.
CA5368: Nastavení ViewStateUserKey pro třídy odvozené ze stránky ViewStateUserKey Nastavením vlastnosti můžete zabránit útokům na vaši aplikaci tím, že jednotlivým uživatelům umožníte přiřadit identifikátor proměnné zobrazení stavu, aby útočníci nemohli tuto proměnnou použít k vygenerování útoku. Jinak dojde k ohrožení zabezpečení pro padělání požadavků mezi weby.
CA5369: Použití Třídy XmlReader pro deserializaci Zpracování nedůvěryhodných schémat DTD a XML může umožnit načítání nebezpečných externích odkazů, které by mělo být omezeno pomocí třídy XmlReader se zabezpečeným překladačem nebo se zakázaným zpracováním vloženého schématu DTD a XML.
CA5370: K ověřování čtečky použijte XmlReader Zpracování nedůvěryhodných schémat DTD a XML může umožnit načítání nebezpečných externích odkazů. Toto nebezpečné načítání může být omezeno pomocí třídy XmlReader se zabezpečeným překladačem nebo se zakázaným zpracováním vloženého schématu DTD a XML.
CA5371: Použití Třídy XmlReader pro čtení schématu Zpracování nedůvěryhodných schémat DTD a XML může umožnit načítání nebezpečných externích odkazů. Použití třídy XmlReader se zabezpečeným překladačem nebo se zakázaným zpracováním vloženého schématu DTD a XML to omezuje.
CA5372: Použití Třídy XmlReader pro XPathDocument Zpracování XML z nedůvěryhodných dat může načíst nebezpečné externí odkazy, které lze omezit pomocí třídy XmlReader se zabezpečeným překladačem nebo se zakázaným zpracováním DTD.
CA5373: Nepoužívejte zastaralou funkci odvození klíče Toto pravidlo detekuje vyvolání slabých metod System.Security.Cryptography.PasswordDeriveBytes odvození klíče a Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes použil slabý algoritmus PBKDF1.
CA5374: Nepoužívejte XslTransform Toto pravidlo zkontroluje, jestli System.Xml.Xsl.XslTransform je v kódu vytvořena instance. System.Xml.Xsl.XslTransform je teď zastaralý a neměl by se používat.
CA5375: Nepoužívejte sdílený přístupový podpis účtu Sdílený přístupový podpis účtu může delegovat přístup k operacím čtení, zápisu a odstraňování v kontejnerech objektů blob, tabulkách, frontách a sdílených složkách, které nejsou povolené pomocí sdíleného přístupového podpisu služby. Nepodporuje ale zásady na úrovni kontejneru a má menší flexibilitu a kontrolu nad udělenými oprávněními. Jakmile ho uživatelé se zlými úmysly získají, váš účet úložiště bude snadno ohrožen.
CA5376: Použití protokolu HttpsOnly SharedAccessProtocol SAS je citlivá data, která nelze přenášet ve formátu prostého textu v protokolu HTTP.
CA5377: Použití zásad přístupu na úrovni kontejneru Zásady přístupu na úrovni kontejneru je možné kdykoli změnit nebo odvolat. Poskytuje větší flexibilitu a kontrolu nad udělenými oprávněními.
CA5378: Nezakazujte ServicePointManagerSecurityProtocols Nastavení Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols pro true omezení připojení TLS (Transport Layer Security) rozhraní WINDOWS Communication Framework (WCF) k používání protokolu TLS 1.0 Tato verze protokolu TLS bude zastaralá.
CA5379: Nepoužívejte slabý algoritmus odvození klíče Ve Rfc2898DeriveBytes výchozím nastavení se třída používá SHA1 algoritmus. Měli byste zadat hashovací algoritmus, který se má použít v některých přetíženích konstruktoru s SHA256 nebo vyššími. Poznámka: HashAlgorithm Vlastnost má pouze přístupový objekt get a nemá overridden modifikátor.
CA5380: Nepřidávejte certifikáty do kořenového úložiště Toto pravidlo zjistí kód, který přidá certifikát do úložiště certifikátů důvěryhodných kořenových certifikačních autorit. Ve výchozím nastavení je úložiště certifikátů důvěryhodných kořenových certifikačních autorit nakonfigurované se sadou veřejných certifikačních autorit, které splňují požadavky programu Microsoft Root Certificate Program.
CA5381: Ujistěte se, že certifikáty nejsou přidány do kořenového úložiště. Toto pravidlo detekuje kód, který potenciálně přidá certifikát do úložiště certifikátů důvěryhodných kořenových certifikačních autorit. Ve výchozím nastavení je úložiště certifikátů důvěryhodných kořenových certifikačních autorit nakonfigurované se sadou veřejných certifikačních autorit(CA), které splňují požadavky programu Microsoft Root Certificate Program.
CA5382: Použití zabezpečených souborů cookie v ASP.NET Core Aplikace dostupné přes PROTOKOL HTTPS musí používat zabezpečené soubory cookie, které označují prohlížeči, že soubor cookie by měl být přenášen pouze pomocí protokolu SSL (Secure Sockets Layer).
CA5383: Ujistěte se, že v ASP.NET Core používejte zabezpečené soubory cookie. Aplikace dostupné přes PROTOKOL HTTPS musí používat zabezpečené soubory cookie, které označují prohlížeči, že soubor cookie by měl být přenášen pouze pomocí protokolu SSL (Secure Sockets Layer).
CA5384: Nepoužívejte algoritmus digitálního podpisu (DSA) DSA je slabý asymetrický šifrovací algoritmus.
CA5385: Použijte algoritmus Rivest–Shamir–Adleman (RSA) s dostatečnou velikostí klíče Klíč RSA menší než 2048 bitů je zranitelnější vůči útokům hrubou silou.
CA5386: Vyhněte se pevně zakódování hodnoty SecurityProtocolType Protokol TLS (Transport Layer Security) zabezpečuje komunikaci mezi počítači, nejčastěji s protokolem HTTPS (Hypertext Transfer Protocol Secure). Verze protokolu TLS 1.0 a TLS 1.1 jsou zastaralé, zatímco protokol TLS 1.2 a TLS 1.3 jsou aktuální. V budoucnu může být protokol TLS 1.2 a TLS 1.3 zastaralý. Pokud chcete zajistit, aby vaše aplikace zůstala zabezpečená, vyhněte se pevně zakódování verze protokolu a cílit alespoň na rozhraní .NET Framework verze 4.7.1.
CA5387: Nepoužívejte slabou funkci odvození klíče s nedostatečným počtem iterací Toto pravidlo zkontroluje, jestli byl kryptografický klíč generován počtem Rfc2898DeriveBytes iterací menší než 100 000. Vyšší počet iterací může pomoct zmírnit útoky slovníku, které se snaží uhodnout vygenerovaný kryptografický klíč.
CA5388: Při použití slabé funkce odvození klíče zajistěte dostatečný počet iterací. Toto pravidlo zkontroluje, jestli byl kryptografický klíč generován pomocí Rfc2898DeriveBytes počtu iterací, který může být menší než 100 000. Vyšší počet iterací může pomoct zmírnit útoky slovníku, které se snaží uhodnout vygenerovaný kryptografický klíč.
CA5389: Nepřidávejte cestu archivní položky k cílové cestě systému souborů Cesta k souboru může být relativní a může vést k přístupu k systému souborů mimo očekávanou cílovou cestu systému souborů, což vede ke škodlivým změnám konfigurace a vzdálenému spuštění kódu prostřednictvím techniky lay-and-wait.
CA5390: Nezakódujte šifrovací klíč pevně zakódovaný Aby byl symetrický algoritmus úspěšný, musí být tajný klíč znám pouze odesílateli a příjemci. Když je klíč pevně zakódovaný, snadno se zjistí. I s kompilovanými binárními soubory je snadné je zlými uživateli extrahovat. Jakmile dojde k ohrožení zabezpečení privátního klíče, může se šifrovací text dešifrovat přímo a už není chráněný.
CA5391: Použití antiforgery tokenů v řadičích ASP.NET Core MVC Zpracování objektu POST, , PUTPATCHnebo DELETE požadavku bez ověření antiforgery tokenu může být zranitelné vůči útokům typu forgery mezi weby. Útok na padělání požadavků mezi weby může posílat škodlivé požadavky ověřeného uživatele do kontroleru ASP.NET Core MVC.
CA5392: Použití atributu DefaultDllImportSearchPaths pro volání nespravovaných položek Ve výchozím nastavení funkce volání nespravovaného kódu pomocí DllImportAttribute sondy řady adresářů, včetně aktuálního pracovního adresáře pro načtení knihovny. To může být problém se zabezpečením pro určité aplikace, což vede k napadení knihovny DLL.
CA5393: Nepoužívejte nebezpečnou hodnotu DllImportSearchPath Ve výchozích adresářích vyhledávání knihoven DLL a adresářích sestavení může existovat škodlivá knihovna DLL. Nebo v závislosti na tom, odkud se vaše aplikace spouští, může v adresáři aplikace existovat škodlivá knihovna DLL.
CA5394: Nepoužívejte nezabezpečenou náhodnost Použití kryptograficky slabého generátoru pseudonáhodných čísel může útočníkovi umožnit předpovědět, jaká hodnota citlivé na zabezpečení se vygeneruje.
CA5395: Chybí atribut HttpVerb pro metody akcí Všechny metody akcí, které vytvářejí, upravují, odstraňují nebo jinak upravují data, musí být chráněny pomocí atributu antiforgery před útoky proti padělání požadavků mezi weby. Provedení operace GET by mělo být bezpečná operace, která nemá žádné vedlejší účinky a neupravuje trvalá data.
CA5396: Nastavte httpOnly na true pro HttpCookie Jako hloubková ochrana se ujistěte, že jsou soubory cookie HTTP citlivé na zabezpečení označené jako HttpOnly. To znamená, že webové prohlížeče by měly zakázat skripty v přístupu k souborům cookie. Injektované škodlivé skripty představují běžný způsob krádeže souborů cookie.
CA5397: Nepoužívejte zastaralé hodnoty SslProtocols Protokol TLS (Transport Layer Security) zabezpečuje komunikaci mezi počítači, nejčastěji s protokolem HTTPS (Hypertext Transfer Protocol Secure). Starší verze protokolu TLS jsou méně zabezpečené než protokoly TLS 1.2 a TLS 1.3 a s větší pravděpodobností mají nová ohrožení zabezpečení. Vyhněte se starším verzím protokolu, abyste minimalizovali riziko.
CA5398: Vyhněte se pevně zakódovaným hodnotám SslProtocols Protokol TLS (Transport Layer Security) zabezpečuje komunikaci mezi počítači, nejčastěji s protokolem HTTPS (Hypertext Transfer Protocol Secure). Verze protokolu TLS 1.0 a TLS 1.1 jsou zastaralé, zatímco protokol TLS 1.2 a TLS 1.3 jsou aktuální. V budoucnu může být protokol TLS 1.2 a TLS 1.3 zastaralý. Pokud chcete zajistit, aby vaše aplikace zůstala zabezpečená, vyhněte se pevně zakódování verze protokolu.
CA5399: Rozhodně zakažte kontrolu seznamu odvolaných certifikátů HttpClient Odvolaný certifikát už není důvěryhodný. Útočníci ho můžou použít předáním některých škodlivých dat nebo krádeží citlivých dat při komunikaci HTTPS.
CA5400: Ujistěte se, že kontrola seznamu odvolaných certifikátů HttpClient není zakázaná. Odvolaný certifikát už není důvěryhodný. Útočníci ho můžou použít předáním některých škodlivých dat nebo krádeží citlivých dat při komunikaci HTTPS.
CA5401: Nepoužívejte CreateEncryptor s jiným než výchozím iv Symetrické šifrování by vždy mělo používat neopakovatelný inicializační vektor, aby se zabránilo útokům na slovník.
CA5402: Použijte CreateEncryptor s výchozím iv Symetrické šifrování by vždy mělo používat neopakovatelný inicializační vektor, aby se zabránilo útokům na slovník.
CA5403: Certifikát pevně nezakódujte Nebo datarawData parametr X509Certificate nebo X509Certificate2 konstruktor je pevně zakódovaný.
CA5404: Nezakazujte kontroly ověření tokenu TokenValidationParameters vlastnosti, které řídí ověření tokenu, by neměly být nastaveny na false.
CA5405: Nepřeskakujte vždy ověření tokenu v delegátech Zpětné volání přiřazené AudienceValidator nebo LifetimeValidator vždy vrátí true.
IL3000: Vyhněte se přístupu k cestě k souboru sestavení při publikování jako jednoho souboru Při publikování jako jednoho souboru se vyhněte přístupu k cestě k souboru sestavení.
IL3001: Vyhněte se přístupu k cestě k souboru sestavení při publikování jako jeden soubor Při publikování jako jednoho souboru se vyhněte přístupu k cestě k souboru sestavení.
IL3002: Vyhněte se volání členů anotovaných pomocí "RequiresAssemblyFilesAttribute" při publikování jako jednoho souboru Vyhněte se volání členů anotovaných pomocí "RequiresAssemblyFilesAttribute" při publikování jako jednoho souboru
IL3003: Poznámky "RequiresAssemblyFilesAttribute" se musí shodovat se všemi implementacemi rozhraní nebo přepsáním. Poznámky RequiresAssemblyFilesAttribute se musí shodovat napříč všemi implementacemi rozhraní nebo přepsáním.

Legenda:

Následující tabulka uvádí typ informací, které jsou k dispozici pro každé pravidlo v referenční dokumentaci.

Položka Popis
Typ TypeName pravidla.
ID pravidla Jedinečný identifikátor pravidla. RuleId a Category se používají k potlačení upozornění ve zdroji.
Kategorie Kategorie pravidla, například zabezpečení.
Oprava způsobující chybu nebo chybu způsobující chybu Jestli je oprava porušení pravidla zásadní změnou. Změna způsobující chybu znamená, že sestavení, které má závislost na cíli, který způsobil narušení, nebude rekompilovat s novou pevnou verzí nebo může v době běhu kvůli změně selhat. Pokud je k dispozici více oprav a aspoň jedna oprava je změna způsobující chybu a jedna oprava není, zadají se obě chyby a chyby způsobující chybu.
Příčina Konkrétní spravovaný kód, který způsobí, že pravidlo vygeneruje upozornění.
Popis Popisuje problémy, které jsou za upozorněním.
Jak opravit porušení Vysvětluje, jak změnit zdrojový kód tak, aby vyhovoval pravidlu, a zabránit mu v generování upozornění.
Kdy potlačit upozornění Popisuje, kdy je bezpečné potlačit upozornění z pravidla.
Příklad kódu Příklady, které porušují pravidlo a opravují příklady, které vyhovují pravidlu.
Související pravidla Související pravidla.