Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í | Description |
|---|---|
| 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, které obsahují uvolnitelné pole, 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. Namísto toho by měly být zpřístupněny obecné kolekce navržené pro dědičnost. |
| CA1003: Použijte instance generických obslužných rutin událostí | Typ obsahuje delegáta, který má návratový typ void a jehož signatura obsahuje dva parametry (prvním je objekt a druhým typ, který je přiřaditelný k typu EventArgs), a sestavení, které tento typ obsahuje, cílí na 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. Výčet bez atributu Flags by měl definovat člena s hodnotou nula, aby výchozí hodnota byla platnou hodnotou daného 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. Zásady správného návrhu vyžadují, aby všechny assembly explicitně uváděly kompatibilitu se specifikací 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 se používá společně se zásadami pro 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 vyžaduje, aby sestavení explicitně určovala svou viditelnost pro COM. Viditelnost pro COM lze nastavit pro celé sestavení a poté ji přepsat pro jednotlivé typy a jejich členy. 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 v reakci na jasně definovanou změnu stavu, měla by být volána obslužnou metodou 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, které poskytují smlouvu určující chování nebo používání. 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 široké publikum, by neměli očekávat, že uživatelé získají zběhlost v práci s parametry out nebo ref. |
| 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 rámci oborů názvů, aby se předešlo kolizím názvů a také k organizaci souvisejících typů v hierarchii objektů. |
| CA1051: Nedeklarujte viditelná pole instance | Pole by se mělo používat především jako detail implementace. Pole by měla být privátní nebo interní a měla by být zpřístupněna prostřednictvím vlastností. |
| CA1052: Typy obsahující pouze statické členy by měly být uzavřené | 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#). Typ, který není určen k dědění, by měl být označen modifikátorem sealed, aby nemohl být použit jako základní typ. |
| CA1053: Typy statických držitelů by neměly 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 | Pokud metoda přijímá řetězcovou reprezentaci identifikátoru URI, měla by být k dispozici odpovídající přetížená varianta, která přijímá instanci třídy URI a poskytuje tyto služby 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 P/Invoke 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: Správně implementovat 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: Implementujte IEquatable při přepisování Equals | Typ hodnoty přepíše Equals metodu, ale neimplementuje IEquatable<T>. |
| CA1067: Přepište metodu Equals při implementaci IEquatable | Typ implementuje IEquatable<T>, ale nepřepíše Equals metodu. |
| CA1068: Parametry typu CancellationToken musí být uvedeny jako 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: Nedeklarujte 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 objekt CultureInfo | Metoda nebo konstruktor volá člena, který má přetížení přijímající parametr typu System.Globalization.CultureInfo, ale tato metoda nebo konstruktor nevolá přetížení, které přijímá parametr System.Globalization.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, ve kterém není nastaven parametr StringComparison. |
| CA1308: Normalizujte řetězce na velká písmena | Řetězce by měly být normalizovány na velká písmena. Malou skupinu znaků po převodu na malá písmena nelze převést zpět do původní podoby. |
| CA1309: Použijte ordinální StringComparison | Operace nelingvistického porovnání řetězců nenastavuje parametr StringComparison na hodnotu Ordinal ani 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é nenastavuje parametr StringComparison, a ve výchozím nastavení používá porovnání řetězců závislé na jazykové verzi a národním prostředí. |
| CA1311: Zadejte kulturu 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: P/Invoke by neměla být veřejně viditelná | Veřejná nebo chráněná metoda ve veřejně přístupném typu má atribut System.Runtime.InteropServices.DllImportAttribute (který se ve Visual Basicu také implementuje pomocí klíčového slova Declare). Tyto metody by neměly být vystaveny. |
| CA1416: Ověřte kompatibilitu platformy | Použití rozhraní API závislých na platformě v komponentě způsobí, že kód přestane fungovat napříč všemi platformami. |
CA1417: Nepoužívejte OutAttribute u řetězcových parametrů pro P/Invoke |
Řetězcové parametry předávané hodnotou pomocí OutAttribute mohou narušit stabilitu modulu runtime, pokud je řetězec internovaným řetězcem. |
| CA1418: Použijte platný řetězec 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é z System.Runtime.InteropServices.SafeHandle |
Poskytnutí bezparametrového konstruktoru pro typ odvozený z System.Runtime.InteropServices.SafeHandle, který je stejně přístupný jako obsahující typ, umožňuje lepší výkon a použití se zdrojově generovanými řešeními interoperability. |
| CA1420: Vlastnost, typ nebo atribut vyžaduje zařazování za běhu | Použití vlastností, které vyžadují zařazování za běhu, když je zařazování za běhu zakázané, způsobí výjimky během 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ěřit kompatibilitu 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 je použit jako argument tam, kde by bylo možné použít výraz nameof. |
| CA1508: Vyhněte se mrtvému podmíněnému kódu | Metoda obsahuje podmíněný kód, který se za běhu vždy vyhodnotí jako true nebo false. To vede k mrtvému kódu v části podmínky false. |
| CA1509: Neplatná položka v konfiguračním souboru metrik kódu | Pravidla pro metriky kódu, například CA1501, CA1502, CA1505 a CA1506, poskytla konfigurační soubor s názvem CodeMetricsConfig.txt, který obsahuje neplatnou položku. |
| CA1510: Použijte pomocnou metodu pro vyvolání výjimky ArgumentNullException | Pomocné metody throw jsou jednodušší a efektivnější než bloky if, které vytvářejí novou instanci výjimky. |
| CA1511: Použijte pomocnou metodu pro vyvolání výjimky ArgumentException | Pomocné metody throw jsou jednodušší a efektivnější než bloky if, které vytvářejí novou instanci výjimky. |
| CA1512: Použijte pomocnou metodu pro vyvolání výjimky ArgumentOutOfRangeException | Pomocné metody throw jsou jednodušší a efektivnější než bloky if, které vytvářejí novou instanci výjimky. |
| CA1513: Použijte pomocnou metodu pro vyvolání ObjectDisposedException | Pomocné metody throw jsou jednodušší a efektivnější než bloky if, které vytvářejí novou instanci výjimky. |
| CA1514: Vyhněte se argumentu redundantní délky | Při ořezávání až do konce řetězce nebo bufferu se používá nadbytečný argument délky. 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í. |
| CA1516: Používejte cross-platformní intrinsiky | Toto pravidlo detekuje použití vnitřních objektů specifických pro platformu, které je možné nahradit ekvivalentním vnitřním objektem pro různé platformy. |
| CA1700: Nepojmenovávejte hodnoty výčtu „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ž jen velikostí písmen | Identifikátory oborů názvů, typů, členů a parametrů se nemohou lišit pouze velikostí písmen, protože jazyky cílené na prostředí common language runtime (CLR) 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 se neopatřují předponou s názvem typu, protože se předpokládá, že vývojové nástroje poskytnou informace o typu. |
| CA1713: Události by neměly mít předponu před nebo po | Název události začíná na „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 s příznaky by mě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 neměly mít stejný název jako obory 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řepisování zvyšuje použitelnost přepsaných metod. 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 protokolu 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 za běhu. |
| CA1805: Neprovádějte zbytečnou inicializaci | 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 statická pole referenčního typu přímo | 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 neinstancovaným interním třídám | 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: Upřednostňujte nepravidelná pole před vícerozměrnými | Zubaté 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 metodu Equals a operátor == u hodnotových typů | 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 implementací Dispose, nevolá GC.SuppressFinalize; nebo metoda, která není implementací Dispose, volá GC.SuppressFinalize; nebo metoda volá GC.SuppressFinalize a předá něco jiného než this (v jazyce Visual Basic Me). |
| 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í. Aby bylo pole odolné proti manipulaci, musí vlastnost vracet kopii 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é finalizátory | 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ý finalizátor způsobuje dodatečnou režii a nepřináší žá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 | Atribut NeutralResourcesLanguage informuje správce prostředků o jazyce, který byl použit k zobrazení prostředků neutrální jazykové verze sestavení. To zlepšuje výkon při vyhledávání prvního prostředku, který načtete, a může to zmenšit 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 Count/LongCount, pokud lze použít Any | Byla použita metoda Count nebo LongCount, přestože metoda Any by byla efektivnější. |
| CA1828: Nepoužívejte CountAsync/LongCountAsync, pokud je možné použít AnyAsync | Byla použita metoda CountAsync nebo LongCountAsync, přestože metoda AnyAsync by byla 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: Upřednostňujte striktně typovaná přetížení metod Append a Insert ve třídě StringBuilder | 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: Pro řetězec použijte místo indexátorů založených na rozsahu metodu AsSpan, pokud je to vhodné | Při použití indexeru rozsahu na řetězci a implicitním přiřazení hodnoty typu ReadOnlySpan<char> bude místo Substring použita metoda Slice, která 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 u pole a implicitním přiřazení hodnoty typu ReadOnlySpan<T> nebo ReadOnlyMemory<T> se místo metody GetSubArray použije metoda Slice, 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 u pole a implicitním přiřazení hodnoty typu Span<T> nebo Memory<T> se místo metody GetSubArray použije metoda Slice, která vytvoří kopii požadované části pole. |
| CA1834: Pro řetězce s jedním znakem použijte StringBuilder.Append(char) |
StringBuilder má přetížení Append, které jako argument přijímá char. Upřednostněte volání přetížení char z výkonových důvodů. |
CA1835: Preferujte přetížení, která jsou založená na Memory, ReadAsync a WriteAsync |
Stream
ReadAsync má přetížení, které přebírá Memory<Byte> jako první argument a WriteAsync přetížení, které přebírá ReadOnlyMemory<Byte> jako první argument. Upřednostněte volání přetížených verzí pracujících s pamětí, které jsou efektivnější. |
CA1836: Použijte IsEmpty místo Count, když je k dispozici |
Upřednostněte IsEmpty vlastnost, která je efektivnější než Count, Lengthnebo Count<TSource>(IEnumerable<TSource>) určit, LongCount<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 parametru StringBuilder pro P/Invoke |
Přiřazování StringBuilder vždy vytvoří nativní kopii vyrovnávací paměti, což vede k několika přidělením pro jednu operaci seř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: Upřednostňujte metody Contains slovníku Dictionary | Volání Contains u kolekce Keys nebo Values může být často nákladnější než volání ContainsKey nebo ContainsValue na samotném slovníku. |
CA1842: Nepoužívejte WhenAll s jedním úkolem |
Použití WhenAll s jednou úlohou může vést ke ztrátě výkonu. Počkejte na dokončení úlohy, nebo ji místo toho vraťte. |
CA1843: Nepoužívejte WaitAll s jedním úkolem |
Použití WaitAll s jednou úlohou může vést ke ztrátě výkonu. Počkejte na dokončení úlohy, nebo ji místo toho vraťte. |
CA1844: Poskytnutí přepisů asynchronních metod založených na paměti při podtřídě Stream |
Chcete-li 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 span-based string.Concat |
Je efektivnější používat AsSpan a string.Concat namísto Substring a operátoru zřetězení. |
CA1846: Upřednostněte AsSpan před Substring |
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žijte znakový literál pro vyhledávání jednoho znaku | Používejte String.Contains(char) místo String.Contains(string) při hledání jednoho znaku. |
| CA1848: Používejte delegáty LoggerMessage | Pro zvýšení výkonu použijte LoggerMessage 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 používat jejich asynchronní verze, pokud jsou k dispozici. |
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: Označte interní typy jako sealed | Typ, který není přístupný mimo své sestavení a nemá ve svém sestavení žádné podtypy, není uzavřený. |
CA1853: Zbytečné volání Dictionary.ContainsKey(key) |
Není třeba chránit Dictionary.Remove(key) pomocí Dictionary.ContainsKey(key).
Dictionary<TKey,TValue>.Remove(TKey) už kontroluje, zda klíč existuje, a pokud neexistuje, nevyhodí výjimku. |
CA1854: Preferujte metodu IDictionary.TryGetValue(TKey, out TValue) |
Upřednostněte TryGetValue místo přístupu k indexeru slovníku, který je chráněn kontrolou pomocí ContainsKey.
ContainsKey a indexer vyhledá klíč, takže použitím TryGetValue se vyhnete dalšímu vyhledávání. |
| CA1855: Použijte span<T>. Clear() místo span<T>. Fill() | Volat Span<T>.Clear() je efektivnější než volat Span<T>.Fill(T) k vyplnění prvků pole Span 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 | Je efektivnější volat String.StartsWith než String.IndexOf, chcete-li zkontrolovat, zda ř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: Vyhněte se použití Enumerable.Any() metody rozšíření |
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. Zvažte jejich extrahování do static readonly polí za účelem zlepšení výkonu. |
CA1862: Použijte přetížení metody StringComparison k provádění porovnání řetězců nerozlišující malá a velká písmena |
Když kód volá ToLower() nebo ToUpper() k provedení porovnání řetězců bez rozlišení velkých a malých písmen, provede se zbytečná alokace. |
CA1863: Použijte CompositeFormat |
Chcete-li snížit náklady na formátování, ukládejte do mezipaměti instanci CompositeFormat a používejte ji jako argument pro String.Format nebo StringBuilder.AppendFormat. |
CA1864: Preferujte metodu IDictionary.TryAdd(TKey, TValue) |
Jak Dictionary<TKey,TValue>.ContainsKey(TKey), tak Dictionary<TKey,TValue>.Add provádějí vyhledávání, což je nadbytečné. Je efektivnější zavolat Dictionary<TKey,TValue>.TryAdd, které vrátí bool, který určuje, zda byla hodnota přidána.
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 |
Jak ISet<T>.Add(T), tak ICollection<T>.Remove(T) provádějí vyhledání, takže je zbytečné předtím volat ICollection<T>.Contains(T). Je efektivnější volat přímo Add(T) nebo Remove(T), které vracejí logickou hodnotu označující, zda byla položka přidána nebo odebrána. |
CA1869: Mezipaměť a opakované použití JsonSerializerOptions instancí |
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žijte uloženou SearchValues instanci v mezipaměti |
Použití instance uložené SearchValues<T> v mezipaměti je efektivnější než předávání hodnot do IndexOfAny nebo ContainsAny přímo. |
CA1871: Nepředávejte strukturu s možnou hodnotou null do ArgumentNullException.ThrowIfNull |
ArgumentNullException.ThrowIfNull přijímá hodnotu object, takže předání struktury s možnou hodnotou null může způsobit, že hodnota bude v rámečku. |
CA1872: Preferujte Convert.ToHexString a Convert.ToHexStringLower místo volacích řetězců 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 šetrnější z hlediska alokace než použití BitConverter.ToString v kombinaci s String.Replace k nahrazení pomlček a String.ToLower. |
| CA1873: Vyhněte se potenciálně nákladnému protokolování | V mnoha situacích je protokolování zakázané nebo nastavené na úroveň protokolu, která vede k zbytečnému vyhodnocení argumentů protokolování. |
CA1874: Použijte Regex.IsMatch |
Regex.IsMatch je jednodušší a rychlejší než Regex.Match(...).Success. |
CA1875: Použijte Regex.Count |
Regex.Count je jednodušší a rychlejší než Regex.Matches(...).Count. |
| CA1877: Použijte přetížení Path.Combine nebo Path.Join | Když je vnořeno více Path.Combine nebo Path.Join operací, mohou být sloučeny do jedné operace, čímž se zlepší výkon a čitelnost. |
| CA2000: Uvolněte objekty před ztrátou rozsahu platnosti | Protože může nastat výjimečná situace, která zabrání spuštění finalizátoru objektu, měl by být objekt explicitně uvolněn dříve, než všechny odkazy na něj přestanou být v rozsahu platnosti. |
| 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 očekává přímo Task. 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 úlohy bez předání objektu TaskScheduler | Operace vytvoření úlohy nebo jejího pokračování používá přetížení metody, které neurčuje parametr TaskScheduler. |
| CA2009: Nevolejte ToImmutableCollection u hodnoty typu ImmutableCollection | Metoda ToImmutable byla zbytečně volána nad neměnnou kolekcí z prostoru názvů System.Collections.Immutable. |
| CA2011: Nepřiřazujte hodnotu vlastnosti v její metodě set | Vlastnosti byla omylem přiřazena hodnota uvnitř její vlastní přístupové metody set. |
| CA2012: Používejte typ ValueTask správně | HodnotaTasks vrácená z volání členů je určena k přímému očekávání. Pokusy o opakované použití objektu ValueTask nebo o přímý přístup k jeho výsledku dříve, než je známo, že byl dokončen, mohou vést k výjimce nebo narušení dat. Ignorování takového ValueTasku pravděpodobně naznačuje funkční chybu a může zhoršit výkon. |
| CA2013: Nepoužívejte ReferenceEquals s hodnotovými typy | 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 stackalloc ve smyčkách. | Prostor zásobníku přidělený stackallocem se uvolní pouze na konci volání aktuální metody. Jeho použití ve smyčce může vést k neomezenému růstu zásobníku a následnému 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, i když ji stále používá Span<T>. |
| CA2016: Předání parametru CancellationToken metodám, které berou jeden | Předejte parametr CancellationToken metodám, které takový parametr přijímají, aby se oznámení o zrušení operace správně předávala dál, nebo explicitně předejte CancellationToken.None, abyste vyjádřili, že token záměrně nepředáváte dál. |
| 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 metody count, Buffer.BlockCopy, by měl 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.
Array.Length byste měli použít pouze pro argument count u polí, jejichž prvky mají velikost přesně jednoho bajtu.
byte, sbytea bool pole obsahují prvky, které mají velikost jednoho bajtu. |
CA2019: ThreadStatic Pole by neměla používat inicializaci přímo v deklaraci |
Proměnná anotovaná pomocí ThreadStaticAttribute je inicializována přímo při deklaraci 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 v kontextu checked nevyvolávaly výjimku, ji nyní vyvolávají, pokud nejsou uzavřeny v kontextu unchecked. |
| 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. |
| CA2022: Vyhněte se nepřesnému čtení pomocí Stream.Read | Volání funkce Stream.Read může vrátit méně bajtů, než bylo požadováno, což může vést k nespolehlivému kódu, pokud není zkontrolována návratová hodnota. |
| CA2023: Neplatné složené závorky v šabloně zprávy | Složené závorky v šabloně zprávy jsou neplatné. Ujistěte se, že všechny složené závorky v šabloně zprávy jsou platné otevírací/zavírací složené závorky nebo jsou escapované. |
| CA2024: Nepoužívejte StreamReader.EndOfStream v asynchronních metodách | Vlastnost StreamReader.EndOfStream může způsobit nezamýšlené synchronní blokování, pokud nejsou uložena žádná data do vyrovnávací paměti. Místo toho použijte StreamReader.ReadLineAsync() přímo, který vrací null při dosažení konce datového proudu. |
CA2025: Nepředávejte IDisposable instance do nečekaných úloh |
Nezařazené úlohy, které používají IDisposable instance, můžou tyto instance používat dlouho po jejich vyřazení. Před zrušením instancí se ujistěte, že jsou dokončeny úlohy, které tyto instance používají. |
| CA2026: Preferujete JsonElement.Parse před JsonDocument.Parse(). RootElement | Je efektivnější volat JsonElement.Parse přímo než zavolat JsonDocument.Parse().RootElement. |
| 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: Zadejte marshaling pro řetězcové argumenty P/Invoke | Člen volání platformy umožňuje volání od částečně důvěryhodných volajících, má parametr typu řetězec a explicitně nemaršaluje řetězec. To může způsobit potenciální ohrožení zabezpečení. |
| CA2109: Zkontrolujte viditelné obslužné rutiny 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 tomu, aby byla metoda přepsána mimo toto sestavení. |
| CA2153: Vyhněte se zpracování výjimek poškozeného stavu | Výjimky poškozeného stavu (CSE) indikují, že ve vašem procesu dochází k 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 tato výjimka je explicitně zadána 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 statická pole hodnotového typu přímo v deklaraci | 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 | Je volán výchozí konstruktor (bez parametrů) typu výjimky, který je typu ArgumentException nebo je od něj odvozen, nebo je konstruktoru s parametry typu výjimky, který je typu ArgumentException nebo je od něj odvozen, předán nesprávný řetězcový argument. |
| 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 Dispose daného pole není volána metodou Dispose typu, který pole deklaruje. |
| 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 Dispose základní třídy | 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 má pole naznačující používání nespravovaných prostředků, nemá finalizátor, jak popisuje metoda Object.Finalize. |
| CA2217: Neoznačujte výčty atributem 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 metodu GetHashCode při přepisování metody Equals | Veřejný typ přepisuje System.Object.Equals, ale nepřepisuje System.Object.GetHashCode. |
| CA2219: Nevyvolávejte výjimky v klauzulích výjimky | Když je v klauzuli finally nebo fault vyvolána výjimka, nová výjimka skryje aktivní výjimku. 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 metodu 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: Implementujte 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řetěžte operátor rovnosti při přepsání metody 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: Řetězcové literály atributů by se měly správně parsovat | Parametr atributu ve formě řetězcového literálu nelze správně parsovat jako adresu URL, identifikátor GUID nebo číslo verze. |
| 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ý konstruktoru TaskCompletionSource by měl být typu výčtu TaskCreationOptions namísto typu výčtu TaskContinuationOptions. | 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 pro Enum.HasFlag | Typ výčtu předaný jako argument při volání metody HasFlag se liší od typu volajícího výčtu. |
| CA2249: Zvažte použití string.Contains místo String.IndexOf | Volání string.IndexOf, jejichž výsledek slouží ke kontrole přítomnosti nebo nepřítomnosti podřetězce, lze nahradit výrazem string.Contains. |
CA2250: Použijte ThrowIfCancellationRequested |
ThrowIfCancellationRequested automaticky ověří, zda byl token zrušen, a pokud ano, vyvolá výjimku OperationCanceledException. |
CA2251: Používejte String.Equals místo String.Compare |
Je to přehlednější a pravděpodobně i rychlejší použít String.Equals místo porovnávání výsledku String.Compare s nulou. |
| 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 rozhraní označeném atributem DynamicInterfaceCastableImplementation | Typy opatřené atributem DynamicInterfaceCastableImplementationAttribute slouží jako implementace rozhraní pro typ, který implementuje typ IDynamicInterfaceCastable. V důsledku toho musí implementovat všechny členy definované ve zděděných rozhraních, protože typ, který implementuje IDynamicInterfaceCastable, je jinak neposkytne. |
CA2257: Členy definované v rozhraní DynamicInterfaceCastableImplementationAttribute by měly být static |
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í DynamicInterfaceCastableImplementation rozhraní v jazyce Visual Basic není podporováno |
Poskytnutí funkčního rozhraní s atributem DynamicInterfaceCastableImplementationAttribute vyžaduje funkci výchozích členů rozhraní, která není v jazyce Visual Basic podporována. |
CA2259: Ujistěte se, že ThreadStatic se používá jenom se statickými poli |
ThreadStaticAttribute
static 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> |
Možnost ConfigureAwaitOptions.SuppressThrowing není podporována obecným Task<TResult>, protože by to mohlo vést k vrácení neplatného TResult. |
CA2262: Správně nastavte MaxResponseHeadersLength |
Ujistěte se, že je hodnota MaxResponseHeadersLength zadána 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ší než předání argumentu System.Type, pokud je typ známý, protože vede k přehlednějšímu a typově bezpečnějšímu kódu s lepšími kontrolami při kompilaci. |
CA2264: Nepředávejte nenulovou hodnotu do ArgumentNullException.ThrowIfNull |
ArgumentNullException.ThrowIfNull vyhodí, když je předaný argument null. Některé konstrukce, jako jsou nenulovatelné struktury a výrazy nameof() a new, jsou známy tím, že nikdy nejsou null, takže ArgumentNullException.ThrowIfNull nikdy nevyvolá výjimku. |
CA2265: Neporovnávejte Span<T> s null ani s default |
Porovnání spanu s null nebo default nemusí fungovat tak, jak jste zamýšleli.
default a literál null jsou implicitně převedeny na Span<T>.Empty. |
CA2266: Vstupní bod programu založený na souborech by měl začínat na #! |
Pokud se program založený na souborech skládá z více souborů, měl by soubor vstupního bodu začínat čárou shebang (#!), aby se jasně odlišil od ostatních zahrnutých souborů. |
| 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 předchozí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: Nedeserializujte bez předchozí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: Nedeserializovat pomocí JavaScriptSerializer s použitím 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é JsonSerializerSettings | 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: Zajistěte, aby nastavení JsonSerializerSettings byla zabezpečená | 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: Nedeserializujte pomocí JsonSerializer s nezabezpečenou konfigurací | 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 objektu DataTable s použitím nedůvěryhodného vstupu může útočník podvrhnout škodlivý vstup a provést útok typu odepření 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 objektu DataSet s použitím nedůvěryhodného vstupu může útočník podvrhnout škodlivý vstup a provést útok typu odepření 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á pomocí SerializableAttribute obsahuje pole nebo vlastnost typu DataSet nebo DataTable a nemá GeneratedCodeAttribute. |
| 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. | Při deserializaci serializovaného objektu System.Runtime.Serialization.IFormatter může graf objektů přetypovaného typu obsahovat prvek DataSet nebo DataTable. |
| CA2355: Nezabezpečená datová sada nebo datová tabulka v deserializovaném grafu objektu | Deserializace, když graf objektů přetypovaného nebo zadaného typu může obsahovat DataSet nebo DataTable. |
| CA2356: Nezabezpečená datová sada nebo datová tabulka v grafu deserializovaného objektu webu | Metoda s System.Web.Services.WebMethodAttribute nebo System.ServiceModel.OperationContractAttribute má parametr, který může odkazovat na DataSet nebo DataTable. |
| 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 objektu DataSet s použitím nedůvěryhodného vstupu může útočník podvrhnout škodlivý vstup a provést útok typu odepření 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 pomocí BinaryFormatter, pokud graf deserializovaných objektů obsahuje DataSet nebo DataTable, může útočník vytvořit škodlivý datový obsah a provést útok vedoucí ke vzdálenému spuštění kódu. |
| CA3001: Zkontrolujte v kódu zranitelnosti vůči SQL injection | 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: Zkontrolujte kód kvůli zranitelnostem typu XSS | 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 v kódu zranitelnosti způsobené injektáží cesty k souboru | 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 kód kvůli ohrožením zabezpečení spočívajícím v zpřístupnění informací. | 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 kód kvůli zranitelnostem vůči injektáži LDAP | 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 kód kvůli zranitelnostem souvisejícím s injektáží příkazů do procesu | 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 kód, zda neobsahuje zranitelnosti typu open redirect | Při práci s nedůvěryhodným vstupem dávejte pozor na zranitelnosti typu open redirect. Útočník může zneužít zranitelnost typu open redirect k tomu, aby prostřednictvím vašeho webu vytvořil dojem legitimní URL adresy, ale nic netušícího návštěvníka přesměroval na phishingovou nebo jinou škodlivou webovou stránku. |
| CA3008: Zkontrolujte kód z hlediska zranitelností vůči injektáži XPath | 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 kód kvůli zranitelnostem způsobeným injektáží XML | Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže XML. |
| CA3010: Zkontrolujte kód, zda neobsahuje ohrožení zabezpečení způsobené injektáží XAML | 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 kód z hlediska zranitelností vůči injektáži DLL | 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 kód, zda neobsahuje zranitelnosti vůči vkládání regulárních výrazů | Při práci s nedůvěryhodným vstupem buďte opatrní na útoky využívající vkládání 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 sloves atributem ValidateAntiForgeryToken | Při návrhu kontroleru ASP.NET MVC mějte na paměti útoky typu padělání požadavků mezi weby (CSRF). Ú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 během 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: Nevypínejte v Schannel používání silného šifrování | Nastavení Switch.System.Net.DontEnableSchUseStrongCrypto na true oslabuje kryptografii používanou v odchozích připojeních protokolu 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 deserializujete nedůvěryhodná data, veškerý kód zpracovávající deserializovaný objektový graf musí umět pracovat s referenčními cykly, aniž by se dostal 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 typu Denial-of-Service pomocí škodlivých dat obsahujících 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 načítání XML do DataSetu | Použití DataSet ke čtení XML s nedůvěryhodnými daty může načíst nebezpečné externí reference, jejichž načítání by mělo být omezeno použitím XmlReader s bezpečným resolverem nebo se zakázaným zpracováním DTD. |
| CA5367: Neserializujte typy s poli ukazatelů | Toto pravidlo zkontroluje, zda existuje serializovatelná třída s polem ukazatele nebo vlastností. Neserializovatelné členy mohou být ukazatele, 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 bude systém zranitelný vůči padělání požadavků mezi weby. |
| CA5369: Použijte 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 referencí, čemuž by se mělo zabránit použitím třídy XmlReader se zabezpečeným resolverem nebo se zakázaným zpracováním vložených schémat 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ů. Tomuto nebezpečnému načítání lze zabránit použitím XmlReaderu se zabezpečeným resolverem nebo se zakázaným zpracováním DTD a vložených schémat XML. |
| CA5371: Pro čtení schématu 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ů. Použití třídy XmlReader se zabezpečeným překladačem nebo s vypnutým zpracováním DTD a vložených schémat XML toto omezuje. |
| CA5372: Použijte XmlReader pro XPathDocument | Při zpracování XML z nedůvěryhodných zdrojů může dojít k načtení nebezpečných externích referencí, čemuž lze zabránit použitím XmlReaderu se zabezpečeným resolverem nebo se zakázaným zpracováním DTD. |
| CA5373: Nepoužívejte zastaralou funkci odvození klíče | Toto pravidlo detekuje použití slabých metod odvozování klíčů System.Security.Cryptography.PasswordDeriveBytes a Rfc2898DeriveBytes.CryptDeriveKey.
System.Security.Cryptography.PasswordDeriveBytes použil slabý algoritmus PBKDF1. |
| CA5374: Nepoužívejte XslTransform | Toto pravidlo kontroluje, zda je System.Xml.Xsl.XslTransform v kódu instanciováno. System.Xml.Xsl.XslTransform je teď zastaralý a neměl by se používat. |
| CA5375: Nepoužívejte sdílený přístupový podpis účtu | SAS účtu může delegovat oprávnění pro operace čtení, zápisu a odstranění u kontejnerů objektů blob, tabulek, front a sdílených složek souborů, které služba SAS neumožňuje. 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 na true omezuje připojení Transport Layer Security (TLS) rozhraní Windows Communication Framework (WCF) na používání protokolu TLS 1.0. Tato verze protokolu TLS bude zastaralá. |
| CA5379: Nepoužívejte slabý algoritmus odvození klíče | Třída Rfc2898DeriveBytes ve výchozím nastavení používá algoritmus SHA1. 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ý. Abyste zajistili, že vaše aplikace zůstane zabezpečená, vyhněte se pevnému zakódování verze protokolu a cílte minimálně na .NET Framework 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 pomoci chránit před slovníkovými útoky, 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 pomoci chránit před slovníkovými útoky, 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žívejte antiforgery tokeny v řadičích ASP.NET Core MVC | Zpracování požadavku POST, PUT, PATCH nebo DELETE bez ověření tokenu proti padělání požadavků může být náchylné k útokům typu CSRF (cross-site request forgery). Ú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žívejte atribut DefaultDllImportSearchPaths pro volání P/Invoke | Ve výchozím nastavení funkce P/Invoke používající DllImportAttribute při načítání knihovny prohledávají několik adresářů, včetně aktuálního pracovního adresáře. 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 hodnotu true u 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 nevý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žívejte 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 | Parametr data nebo rawData konstruktoru X509Certificate nebo X509Certificate2 je napevno zakódován. |
| 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é k AudienceValidator nebo LifetimeValidator vždy vrací true. |
| IL3000: Vyhněte se přístupu k cestě k souboru sestavení při publikování do 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 assembly při publikování do jednoho souboru | 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 RequiresAssemblyFilesAttribute při publikování jako jednoho souboru |
Vyhněte se volání členů anotovaných RequiresAssemblyFilesAttribute při publikování jako jednoho souboru |
IL3003: RequiresAssemblyFilesAttribute Anotace se musí shodovat u všech implementací rozhraní nebo jejich překrytí. |
RequiresAssemblyFilesAttribute poznámky musí odpovídat všem implementacím rozhraní nebo přetížení. |
IL3005: RequiresAssemblyFilesAttribute nelze umístit přímo do vstupního bodu aplikace. |
RequiresAssemblyFilesAttribute nelze umístit přímo do vstupního bodu aplikace. |
Legend
Následující tabulka uvádí typ informací, které jsou k dispozici pro každé pravidlo v referenční dokumentaci.
| Item | Description |
|---|---|
| Typ | TypeName pro pravidlo. |
| Identifikátor pravidla | Jedinečný identifikátor pravidla. RuleId a Category se používají k potlačení upozornění ve zdroji. |
| Category | Kategorie pravidla, například zabezpečení. |
| Oprava je zpětně kompatibilní, nebo nekompatibilní | Jestli je oprava porušení pravidla zásadní změnou. Zásadní změna znamená, že sestavení, které je závislé na cíli, který tuto změnu způsobil, nebude možné rekompilovat s novou opravenou verzí, nebo může selhat za běhu kvůli této změně. Pokud je k dispozici více oprav a alespoň jedna oprava představuje zásadní změnu a alespoň jedna nikoli, uvedou se obě označení „Breaking“ a „Non-breaking“. |
| Cause | Konkrétní spravovaný kód, který způsobí, že pravidlo vygeneruje upozornění. |
| Description | 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í generované tímto pravidlem. |
| Příklad kódu | Příklady, které porušují pravidlo a opravují příklady, které vyhovují pravidlu. |
| Související pravidla | Související pravidla. |