Regole di qualità del codice

L'analisi del codice .NET fornisce regole che mirano a migliorare la qualità del codice. Le regole sono organizzate in aree come progettazione, globalizzazione, prestazioni e sicurezza. Alcune regole sono specifiche per l'utilizzo dell'API .NET, mentre altre riguardano la qualità del codice generico.

Indice delle regole

Nella tabella seguente sono elencate le regole di analisi della qualità del codice.

ID regola e avviso Descrizione
CA1000: Non dichiarare membri statici su tipi generici Quando viene chiamato un membro statico di un tipo generico, è necessario specificare l'argomento di tipo. Quando viene chiamato un membro di istanza generica che non supporta l'inferenza, è necessario specificare l'argomento tipo relativo al membro. In questi due casi, la sintassi necessaria per specificare l'argomento di tipo è diversa e può generare confusione.
CA1001: I tipi proprietari di campi Disposable devono essere Disposable Una classe dichiara e implementa un campo di istanza di tipo System.IDisposable e la classe non implementa IDisposable. Una classe che dichiara un campo IDisposable è indirettamente proprietaria di una risorsa non gestita e deve implementare l'interfaccia IDisposable.
CA1002: Non esporre elenchi generici System.Collections.Generic.List<(Of <(T>)>) è una raccolta generica progettata per le prestazioni, non per l'ereditarietà. List, pertanto, non contiene membri virtuali. Devono invece essere esposte le raccolte generiche che sono state progettate per l'ereditarietà.
CA1003: Usare istanze di gestori eventi generici Un tipo contiene un delegato che restituisce void, la cui firma contiene due parametri (il primo oggetto e il secondo un tipo assegnabile a EventArgs) e l'assembly contenitore è destinato a Microsoft .NET Framework 2.0.
CA1005: Evitare un uso eccessivo di parametri nei tipi generici Quanto più è alto il numero di parametri di tipo contenuti, maggiore è la difficoltà di sapere e ricordare cosa rappresenta ciascun parametro. In genere è ovvio con un parametro di tipo, come in List<T>, e in alcuni casi con due parametri di tipo, come in Dictionary<TKey, TValue>. Tuttavia, se il numero dei parametri di tipo è superiore a due, il livello di difficoltà sarà troppo elevato per la maggior parte degli utenti.
CA1008: Gli enum devono avere valore zero Il valore predefinito di un'enumerazione non inizializzata, come altri tipi di valore, è zero. Un'enumerazione senza attributi flag definisce un membro utilizzando il valore zero in modo che il valore predefinito sia un valore valido dell'enumerazione. Se un'enumerazione a cui è applicato l'attributo FlagsAttribute definisce un membro con valore zero, il relativo nome deve essere "None" per indicare che nell'enumerazione non è stato impostato alcun valore.
CA1010: Le raccolte devono implementare un'interfaccia generica Per ampliare la possibilità di utilizzo di una raccolta, implementare una delle interfacce di raccolta generiche. La raccolta può quindi essere utilizzata per popolare tipi di raccolte generiche.
CA1012: I tipi astratti non devono avere costruttori pubblici I costruttori sui tipi astratti possono essere chiamati solo da tipi derivati. Poiché i costruttori pubblici creano istanze di un tipo e non è possibile creare istanze di un tipo astratto, per una buona progettazione non bisognerebbe creare un tipo astratto con costruttore pubblico.
CA1014: Contrassegnare gli assembly con CLSCompliantAttribute In Common Language Specification (CLS) vengono definite limitazioni di denominazione, tipi di dati e regole che gli assembly devono rispettare per poter essere utilizzati tra diversi linguaggi di programmazione. In una progettazione corretta tutti gli assembly devono indicare in modo esplicito la conformità CLS utilizzando CLSCompliantAttribute. Se questo attributo non è presente in un assembly, tale assembly non è conforme.
CA1016: Contrassegnare gli assembly con AssemblyVersionAttribute .NET usa il numero di versione per identificare in modo univoco un assembly e per eseguire l'associazione ai tipi in assembly con nome sicuro. Il numero di versione viene utilizzato insieme ai criteri di versione ed editore. Per impostazione predefinita, le applicazioni vengono eseguite solo con la versione di assembly con cui sono state compilate.
CA1017: Contrassegnare gli assembly con ComVisibleAttribute ComVisibleAttribute determina il modo in cui i client COM accedono al codice gestito. In una buona progettazione gli assembly devono indicare in modo esplicito la visibilità COM. È possibile impostare la visibilità COM per l'intero assembly e quindi eseguirne l'override per singoli tipi e membri dei tipi. Se questo attributo non è presente, il contenuto dell'assembly è visibile ai client COM.
CA1018: Contrassegnare gli attributi con AttributeUsageAttribute Quando si definisce un attributo personalizzato, contrassegnarlo tramite AttributeUsageAttribute per indicare la posizione nel codice sorgente in cui applicare l'attributo personalizzato. Il significato e l'utilizzo previsto di un attributo ne determinano le posizioni valide nel codice.
CA1019: Definire le funzioni di accesso per gli argomenti degli attributi Gli attributi possono definire argomenti obbligatori che devono essere specificati quando si applica l'attributo a una destinazione. Sono inoltre noti come argomenti posizionali poiché vengono forniti ai costruttori di attributo come parametri posizionali. Per ogni argomento obbligatorio, l'attributo deve fornire anche una proprietà in sola lettura corrispondente in modo che il valore dell'argomento possa essere recuperato in fase di esecuzione. Gli attributi possono inoltre definire argomenti facoltativi, noti anche come argomenti denominati. Questi argomenti sono forniti ai costruttori degli attributi in base al nome e devono disporre di una proprietà in lettura e scrittura corrispondente.
CA1021: Evitare parametri out Il passaggio di tipi per riferimento (mediante out o ref) richiede esperienza nell'utilizzo dei puntatori, nonché la conoscenza delle differenze tra tipi di valore e tipi di riferimento e dei metodi di gestione con più valori restituiti. Inoltre, la differenza tra parametri out e ref non è sempre nota.
CA1024: Usare proprietà dove appropriato Un metodo pubblico o protetto presenta un nome che inizia con "Get", non accetta parametri e restituisce un valore diverso da una matrice. Il metodo presenta tutte le caratteristiche per diventare una proprietà.
CA1027: Contrassegnare le enumerazioni con FlagsAttribute Un'enumerazione è un tipo di valore che definisce un insieme di costanti denominate correlate. Applicare FlagsAttribute a un'enumerazione quando le relative costanti denominate possono essere combinate in modo significativo.
CA1028: L'archivio di enum deve essere Int32 Un'enumerazione è un tipo di valore che definisce un insieme di costanti denominate correlate. Per impostazione predefinita, il tipo di dati System.Int32 viene utilizzato per archiviare il valore costante. Benché sia possibile modificare il tipo sottostante, questa operazione non è necessaria né consigliata nella maggior parte degli scenari.
CA1030: Usare eventi dove appropriato Questa regola rileva i metodi che presentano nomi comunemente utilizzati per gli eventi. Se un metodo viene chiamato in risposta a una modifica dello stato chiaramente definita, il metodo deve essere richiamato da un gestore eventi. Gli oggetti che chiamano il metodo devono generare eventi anziché chiamare direttamente il metodo.
CA1031: Non rilevare tipi di eccezione generali Le eccezioni generali non devono essere rilevate. Rilevare un'eccezione più specifica oppure generare nuovamente l'eccezione generale come ultima istruzione nel blocco catch.
CA1032: Implementare costruttori di eccezioni standard Se non viene fornito l'insieme completo di costruttori può risultare difficile gestire correttamente le eccezioni.
CA1033: I metodi di interfaccia devono essere richiamabili dai tipi figlio Un tipo visibile esternamente non sealed fornisce un'implementazione di metodo esplicita di un'interfaccia pubblica e non fornisce un metodo visibile esternamente alternativo con lo stesso nome.
CA1034: I tipi annidati non devono essere visibili Un tipo annidato è un tipo dichiarato nell'ambito di un altro tipo. I tipi annidati sono utili per incapsulare dettagli di implementazione privati del tipo contenitore. I tipi annidati utilizzati per questo scopo non devono essere visibili esternamente.
CA1036: Eseguire l'override di metodi su tipi confrontabili Un tipo pubblico o protetto implementa l'interfaccia System.IComparable. Non esegue l'override di Object.Equals né l'overload dell'operatore specifico del linguaggio per uguaglianza, ineguaglianza, minore di o maggiore di.
CA1040: Evitare l'uso di interfacce vuote Le interfacce definiscono membri che forniscono un comportamento o un contratto di utilizzo. La funzionalità descritta dall'interfaccia può essere adottata da qualsiasi tipo, indipendentemente dal punto in cui il tipo è visualizzato nella gerarchia di ereditarietà. Un tipo implementa un'interfaccia fornendo implementazioni per i membri dell'interfaccia. Un'interfaccia vuota non definisce alcun membro. Di conseguenza, non definisce un contratto implementabile.
CA1041: Specificare una proprietà ObsoleteAttribute.Message Un tipo o un membro viene contrassegnato utilizzando un attributo System.ObsoleteAttribute per cui non è stata specificata la proprietà ObsoleteAttribute.Message. Quando viene compilato un membro o un tipo contrassegnato utilizzando ObsoleteAttribute, viene visualizzata la proprietà Message dell'attributo. In questo modo vengono fornite le informazioni utente sul tipo o sul membro obsoleto.
CA1043: Usare argomento di tipo stringa o integrale per gli indicizzatori Gli indicizzatori, ovvero le proprietà indicizzate, devono utilizzare tipi integrali o stringa per l'indice. Questi tipi vengono in genere utilizzati per l'indicizzazione di strutture di dati e aumentano l'utilizzabilità della libreria. L'utilizzo del tipo Object deve essere limitato ai casi in cui non sia possibile specificare in fase di progettazione il tipo integrale o stringa.
CA1044: Le proprietà non devono essere in sola scrittura Sebbene la presenza di proprietà di sola lettura sia accettabile e spesso necessaria, le linee guida di progettazione proibiscono l'utilizzo di proprietà di sola scrittura. Ciò è dovuto al fatto che consentire a un utente di impostare un valore e quindi impedirgli di visualizzarlo, non offre alcuna sicurezza. Inoltre, senza accesso in lettura, lo stato degli oggetti condivisi non può essere visualizzato, il che ne limita l'utilità.
CA1045: Non passare i tipi per riferimento Il passaggio di tipi per riferimento (mediante out o ref) richiede esperienza nell'utilizzo dei puntatori, nonché la conoscenza delle differenze tra tipi di valore e tipi di riferimento e dei metodi di gestione con più valori restituiti. Gli architetti della libreria che progettano per un pubblico generale non devono aspettarsi che gli utenti diventino esperti nell'uso di out parametri o ref .
CA1046: Non eseguire l'overload dell'operatore "uguale a" per i tipi di riferimento Per i tipi di riferimento, l'implementazione predefinita dell'operatore di uguaglianza è quasi sempre corretta. Per impostazione predefinita, i due riferimenti sono uguali solo se puntano allo stesso oggetto.
CA1047: Non dichiarare membri protetti nei tipi sealed I tipi dichiarano membri protetti in modo che i tipi che ereditano possano accedere al membro o eseguirne l'override. Per definizione, non è possibile ereditare tipi sealed, pertanto non è possibile chiamare metodi protetti su tipi sealed.
CA1050: Dichiarare i tipi negli spazi dei nomi I tipi vengono dichiarati in spazi dei nomi per impedire conflitti di denominazione e per organizzare i tipi correlati in una gerarchia di oggetti.
CA1051: Non dichiarare campi di istanza visibili L'utilizzo principale di un campo deve essere come dettaglio di implementazione. I campi devono essere privati o interni e devono essere esposti tramite proprietà.
CA1052: I tipi che contengono membri statici devono essere sealed Un tipo pubblico o protetto contiene solo membri statici e non è dichiarato utilizzando il modificatore (NotInheritable) (Riferimenti per C#) sealed. Un tipo non adatto a essere ereditato deve essere contrassegnato utilizzando il modificatore sealed per impedire che venga utilizzato come tipo di base.
CA1053: I tipi che contengono membri statici non devono avere costruttori Un tipo pubblico o annidato dichiara solo membri statici e presenta un costruttore predefinito pubblico o protetto. Il costruttore non è necessario perché la chiamata a membri statici non richiede un'istanza del tipo. A scopo di sicurezza e protezione, l'overload dei valori di stringa deve chiamare l'overload URI tramite l'argomento stringa.
CA1054: I parametri URI non devono essere stringhe Se un metodo accetta una rappresentazione in forma di stringa di un URI, è necessario fornire un overload corrispondente che accetti un'istanza della classe URI che fornisce questi servizi in modo sicuro e protetto.
CA1055: I valori restituiti URI non devono essere stringhe Questa regola presuppone che il metodo restituisca un URI. Una rappresentazione in forma di stringa di un URI è soggetta a errori di analisi e codifica e può creare vulnerabilità nella sicurezza. La classe System.Uri fornisce questi servizi in modo sicuro e protetto.
CA1056: Le proprietà URI non devono essere stringhe Questa regola presuppone che la proprietà rappresenti un URI (Uniform Resource Identifier). Una rappresentazione in forma di stringa di un URI è soggetta a errori di analisi e codifica e può creare vulnerabilità nella sicurezza. La classe System.Uri fornisce questi servizi in modo sicuro e protetto.
CA1058: I tipi non devono estendere tipi di base specifici Un tipo visibile esternamente estende tipi di base specifici. Utilizzare una delle alternative seguenti:
CA1060: Spostare P/Invoke nella classe NativeMethods Metodi di chiamata della piattaforma, ad esempio quelli contrassegnati tramite l'attributo System.Runtime.InteropServices.DllImportAttribute o i metodi definiti usando la Declare parola chiave in Visual Basic, accedono al codice non gestito. Questi metodi devono appartenere alla classe NativeMethods, SafeNativeMethods o UnsafeNativeMethods.
CA1061: Non nascondere i metodi di una classe base Un metodo di un tipo di base è nascosto da un metodo denominato in modo identico in un tipo derivato, quando la firma del parametro del metodo derivato differisce solo per i tipi che presentano una derivazione più debole rispetto ai tipi corrispondenti nella firma del parametro del metodo di base.
CA1062: Convalidare gli argomenti di metodi pubblici È necessario che tutti gli argomenti di riferimento passati a metodi visibili esternamente vengano sottoposti a verifica per accertarsi che non corrispondano a valori Null.
CA1063: Implementare IDisposable correttamente È necessario che tutti i tipi IDisposable implementino correttamente il modello Dispose.
CA1064: Le eccezioni devono essere pubbliche Un'eccezione interna è visibile solo nel relativo ambito interno. Se l'eccezione si verifica al di fuori dell'ambito interno, può essere rilevata solo tramite l'eccezione di base. Se l'eccezione interna viene ereditata da Exception, SystemExceptiono ApplicationException, il codice esterno non avrà informazioni sufficienti per sapere cosa fare con l'eccezione.
CA1065: Non generare eccezioni in posizioni impreviste Un metodo che normalmente non genera eccezioni genera un'eccezione.
CA1066: Implementare IEquatable quando si esegue l'override di Equals Un tipo valore esegue l'override Equals del metodo , ma non implementa IEquatable<T>.
CA1067: Eseguire l'override di Equals durante l'implementazione di IEquatable Un tipo implementa IEquatable<T>, ma non esegue l'override Equals del metodo .
CA1068: I parametri CancellationToken devono venire per ultimi Un metodo ha un parametro CancellationToken che non è l'ultimo parametro.
CA1069: Le enumerazioni non devono avere valori duplicati Un'enumerazione ha più membri a cui viene assegnato in modo esplicito lo stesso valore costante.
CA1070: Non dichiarare campi evento come virtuali Un evento simile a un campo è stato dichiarato come virtuale.
CA1200: Evitare di usare tag cref con un prefisso L'attributo cref in un tag di documentazione XML significa "riferimento al codice". Specifica che il testo all'interno del tag è un elemento di codice, ad esempio un tipo, un metodo o una proprietà. Evitare di usare cref tag con prefissi, perché impedisce al compilatore di verificare i riferimenti. Impedisce inoltre all'ambiente di sviluppo integrato (IDE) di Visual Studio di trovare e aggiornare questi riferimenti a simboli durante il refactoring.
CA1303: Non passare valori letterali come parametri localizzati Un metodo visibile esternamente passa un valore letterale stringa come parametro a un costruttore o a un metodo .NET e tale stringa deve essere localizzabile.
CA1304: Specificare CultureInfo Un metodo o un costruttore chiama un membro che presenta un overload che accetta un parametro System.Globalization.CultureInfo e tale metodo o costruttore non chiama l'overload che accetta il parametro CultureInfo. Quando non viene fornito un oggetto CultureInfo o System.IFormatProvider, il valore predefinito fornito dal membro di overload potrebbe non avere l'effetto desiderato in tutte le impostazioni locali.
CA1305: Specificare IFormatProvider Un metodo o un costruttore chiama uno o più membri con overload che accettano un parametro System.IFormatProvider e tale metodo o costruttore non chiama l'overload che accetta il parametro IFormatProvider. Quando non viene fornito un oggetto System.Globalization.CultureInfo o IFormatProvider, il valore predefinito fornito dal membro di overload potrebbe non avere l'effetto desiderato in tutte le impostazioni locali.
CA1307: Specificare StringComparison per maggiore chiarezza Un'operazione di confronto tra stringhe utilizza un overload del metodo che non imposta un parametro StringComparison.
CA1308: Normalizzare le stringhe in lettere maiuscole Le stringhe devono essere normalizzate in maiuscolo. Un piccolo gruppo di caratteri non è in grado di completare un round trip in caso di conversione in lettere minuscole.
CA1309: Usare StringComparison ordinale In un'operazione di confronto tra stringhe di tipo non linguistico il parametro StringComparison non viene impostato su Ordinal o OrdinalIgnoreCase. L'impostazione esplicita del parametro su StringComparison.Ordinal o StringComparison.OrdinalIgnoreCase consente spesso di rendere il codice più veloce, corretto e affidabile.
CA1310: Specificare StringComparison per la correttezza Un'operazione di confronto tra stringhe usa un overload del metodo che non imposta un parametro StringComparison e usa il confronto di stringhe specifiche delle impostazioni cultura per impostazione predefinita.
CA1311: specificare una cultura o usare una versione invariante Specificare impostazioni cultura o usare impostazioni cultura invarianti per evitare dipendenze implicite dalle impostazioni cultura correnti quando si chiama ToUpper o ToLower.
CA1401: I P/Invoke non devono essere visibili Un metodo pubblico o protetto in un tipo pubblico ha l'attributo System.Runtime.InteropServices.DllImportAttribute (implementato anche dalla parola chiave Declare in Visual Basic). Questi metodi non devono essere esposti.
CA1416: Convalida compatibilità della piattaforma L'uso di API dipendenti dalla piattaforma in un componente rende il codice non più funzionante in tutte le piattaforme.
CA1417: Non usare OutAttribute nei parametri stringa per P/Invokes I parametri stringa passati per valore con OutAttribute possono destabilizzare il runtime se la stringa è una stringa internata.
CA1418: Usare una stringa di piattaforma valida L'analizzatore di compatibilità della piattaforma richiede un nome e una versione della piattaforma validi.
CA1419: specificare un costruttore senza parametri visibile come il tipo contenitore per i tipi concreti derivati da 'System.Runtime.InteropServices. Cassaforte Handle' Fornire un costruttore senza parametri visibile come il tipo contenitore per un tipo derivato da System.Runtime.InteropServices.SafeHandle consente prestazioni e utilizzo migliori con soluzioni di interoperabilità generate dall'origine.
CA1420: La proprietà, il tipo o l'attributo richiede il marshalling di runtime L'uso di funzionalità che richiedono il marshalling di runtime quando il marshalling di runtime è disabilitato genererà eccezioni in fase di esecuzione.
CA1421: Il metodo usa il marshalling di runtime quando viene applicato DisableRuntimeMarshallingAttribute Un metodo usa il marshalling di runtime e il marshalling di runtime è disabilitato in modo esplicito.
CA1422: Convalidare la compatibilità della piattaforma Non è consigliabile chiamare un'API obsoleta in un determinato sistema operativo (versione) da un sito di chiamata raggiungibile da tale sistema operativo (versione).
CA1501: Evitare ereditarietà eccessiva Un tipo si trova oltre il quarto livello di annidamento nella gerarchia di ereditarietà. Le gerarchie di tipi eccessivamente annidate possono comportare difficoltà di comprensione e gestione.
CA1502: Evitare complessità eccessiva Questa regola misura il numero di percorsi linearmente indipendenti tramite il metodo, determinato dal numero e dalla complessità di rami condizionali.
CA1505: evitare codice non gestibile Un tipo o metodo presenta un valore di indice di gestibilità basso. Un indice di manutenibilità basso indica che un tipo o un metodo è probabilmente difficile da gestire e sarebbe un buon candidato per la riprogettazione.
CA1506: Evitare un numero eccessivo di accoppiamenti di classi Questa regola misura l'accoppiamento tra classi contando il numero di riferimenti al tipo univoci contenuti in un tipo o metodo.
CA1507: Usare nameof al posto della stringa Un valore letterale stringa viene usato come argomento in cui è possibile usare un'espressione nameof .
CA1508: Evitare codice condizionale non morto Un metodo ha codice condizionale che restituisce true sempre o false in fase di esecuzione. In questo modo si verifica un false codice inattivo nel ramo della condizione.
CA1509: voce non valida nel file di configurazione delle metriche del codice Regole delle metriche del codice, ad esempio CA1501, CA1502, CA1505 e CA1506, hanno fornito un file di configurazione denominato CodeMetricsConfig.txt con una voce non valida.
CA1510: Usare l'helper throw ArgumentNullException Gli helper throw sono più semplici ed efficienti rispetto ai if blocchi che costruiscono una nuova istanza di eccezione.
CA1511: Usare l'helper throw ArgumentException Gli helper throw sono più semplici ed efficienti rispetto ai if blocchi che costruiscono una nuova istanza di eccezione.
CA1512: Usare l'helper throw ArgumentOutOfRangeException Gli helper throw sono più semplici ed efficienti rispetto ai if blocchi che costruiscono una nuova istanza di eccezione.
CA1513: Usare l'helper throw ObjectDisposedException Gli helper throw sono più semplici ed efficienti rispetto ai if blocchi che costruiscono una nuova istanza di eccezione.
CA1514: Evitare l'argomento lunghezza ridondante Un argomento di lunghezza ridondante viene usato quando si esegue il sezionamento alla fine di una stringa o di un buffer. Una lunghezza calcolata può essere soggetta a errori e non è necessaria.
CA1515: Valutare la possibilità di rendere interni i tipi pubblici A differenza di una libreria di classi, l'API di un'applicazione non viene in genere fatto riferimento pubblicamente, quindi i tipi possono essere contrassegnati come interni.
CA1700: Non denominare 'Reserved' i valori di enumerazione Questa regola presuppone che un membro di enumerazione con un nome che contiene la parola "reserved" non sia attualmente utilizzato, ma sia un segnaposto che dovrà essere rinominato o rimosso in una versione futura. La ridenominazione o rimozione di un membro è ritenuta una modifica sostanziale.
CA1707: Gli identificatori non devono contenere caratteri di sottolineatura Per convenzione i nomi degli identificatori non contengono il carattere di sottolineatura (_). In base a questa regola vengono controllati spazi dei nomi, tipi, membri e parametri.
CA1708: Gli identificatori non si devono differenziare solo in base alle maiuscole e minuscole Gli identificatori per spazi dei nomi, tipi, membri e parametri non possono differire solo in base a maiuscole e minuscole poiché ai linguaggi destinati a Common Language Runtime non è richiesta la distinzione tra maiuscole e minuscole.
CA1710: Gli identificatori devono contenere il suffisso corretto Per convenzione, i nomi dei tipi che estendono determinati tipi di base o implementano determinate interfacce o dei tipi derivati da questi tipi contengono un suffisso associato al tipo di base o all'interfaccia.
CA1711: Gli identificatori non devono contenere un suffisso non corretto Per convenzione, solo i nomi dei tipi che estendono determinati tipi di base o che implementano determinate interfacce o dei tipi derivati da questi tipi devono terminare con suffissi specifici riservati. Gli altri nomi di tipi non devono utilizzare questi suffissi riservati.
CA1712: Non usare nomi di tipo come prefisso nei valori di enumerazione I nomi dei membri di enumerazione non hanno come prefisso il nome del tipo poiché si prevede che le informazioni sul tipo vengano fornite dagli strumenti di sviluppo.
CA1713: Non usare il prefisso Before o After negli eventi Il nome di un evento inizia con "Before" o "After". Per denominare eventi correlati generati in una sequenza specifica, utilizzare i tempi verbali presente o passato per indicare la posizione relativa nella sequenza di azioni.
CA1714: Le enumerazioni con Flags devono avere nomi plurali Un'enumerazione pubblica dispone dell'attributo System.FlagsAttribute e il nome non termina per "s". Ai tipi contrassegnati utilizzando FlagsAttribute sono assegnati nomi plurali perché tale attributo indica che è possibile specificare più valori.
CA1715: Gli identificatori devono contenere il prefisso corretto Il nome di un'interfaccia visibile esternamente non inizia con una "I" maiuscola. Il nome di un parametro di tipo generico su un tipo o metodo visibile esternamente non inizia con una "T" maiuscola.
CA1716: Gli identificatori non devono corrispondere a parole chiave Un nome di spazio dei nomi o di tipo corrisponde a una parola chiave riservata in un linguaggio di programmazione. Gli identificatori di spazi dei nomi e tipi non devono corrispondere a parole chiave definite dai linguaggi con destinazione Common Language Runtime.
CA1717: Solo le enumerazioni con FlagsAttribute devono avere nomi plurali In base alle convenzioni di denominazione, un nome plurale in un'enumerazione indica che è possibile specificare più valori di enumerazione contemporaneamente.
CA1720: Gli identificatori non devono contenere nomi di tipo Il nome di un parametro in un membro visibile esternamente contiene un nome di tipo di dati oppure il nome di un membro visibile esternamente contiene un nome di tipo di dati specifico del linguaggio.
CA1721: I nomi delle proprietà non devono corrispondere ai metodi get Il nome di un membro pubblico o protetto inizia con "Get" e corrisponde in altro modo al nome di una proprietà pubblica o protetta. I metodi "Get" e le proprietà devono avere nomi indicano chiaramente la distinzione tra le funzioni.
CA1724: I nomi dei tipi non devono corrispondere agli spazi dei nomi I nomi dei tipi non devono corrispondere ai nomi degli spazi dei nomi .NET. La violazione di questa regola può ridurre l'utilizzabilità della libreria.
CA1725: I nomi dei parametri devono corrispondere alla dichiarazione di base Una denominazione coerente dei parametri in una gerarchia di override aumenta la funzionalità degli override di metodo. Un nome di parametro in un metodo derivato diverso dal nome nella dichiarazione di base può provocare confusione sulla natura del metodo, ovvero se si tratta di un override del metodo di base o di un nuovo overload del metodo.
CA1727: Usare PascalCase per i segnaposto denominati Usare PascalCase per i segnaposto denominati nel modello di messaggio di registrazione.
CA1801: Rivedere i parametri non usati Una firma di metodo include un parametro non utilizzato nel corpo del metodo.
CA1802: Usa valori letterali dove appropriato Un campo viene dichiarato statico e di sola lettura (Shared e ReadOnly in Visual Basic) e viene inizializzato usando un valore calcolabile in fase di compilazione. Poiché il valore assegnato al campo di destinazione è calcolabile in fase di compilazione, modificare la dichiarazione in un campo const (Const in Visual Basic) in modo che il valore venga calcolato in fase di compilazione anziché in fase di esecuzione.
CA1805: Non inizializzare inutilmente Il runtime .NET inizializza tutti i campi dei tipi di riferimento sui relativi valori predefiniti prima di eseguire il costruttore. Nella maggior parte dei casi, l'inizializzazione esplicita di un campo sul valore predefinito è ridondante, che aggiunge ai costi di manutenzione e può ridurre le prestazioni, ad esempio con dimensioni di assembly aumentate.
CA1806: Non ignorare i risultati del metodo Un nuovo oggetto viene creato, ma non viene mai utilizzato oppure viene chiamato un metodo che crea e restituisce una nuova stringa e la nuova stringa non viene mai utilizzata oppure un metodo COM o P/Invoke restituisce un HRESULT o un codice di errore che non viene mai utilizzato.
CA1810: Inizializzare i campi statici del tipo di riferimento inline Quando un tipo dichiara un costruttore statico esplicito, tramite il compilatore JIT (Just-In-Time) viene aggiunto un controllo a ogni metodo statico del tipo e a ogni costruttore di istanza del tipo per assicurare che il costruttore statico sia stato precedentemente chiamato. I controlli dei costruttori statici possono ridurre le prestazioni.
CA1812: Evitare classi interne prive di istanze Un'istanza di un tipo a livello di assembly non viene creata dal codice nell'assembly.
CA1813: Evitare attributi non sealed .NET fornisce metodi per il recupero di attributi personalizzati. Per impostazione predefinita, questi metodi eseguono ricerche nella gerarchia di ereditarietà dell'attributo. L'utilizzo di attributi sealed elimina la ricerca nella gerarchia di ereditarietà e può migliorare le prestazioni.
CA1814: Preferire matrici di matrici rispetto a matrici multidimensionali Una matrice di matrici è una matrice i cui elementi sono costituiti da matrici. Poiché le matrici che costituiscono gli elementi possono presentare dimensioni diverse, la quantità di spazio inutilizzato sarà inferiore per alcuni insiemi di dati.
CA1815: Eseguire l'override di Equals e dell'operatore "uguale a" sui tipi di valore Per i tipi di valore, l'implementazione ereditata di Equals utilizza la libreria Reflection e confronta il contenuto di tutti i campi. La libreria Reflection è onerosa dal punto di vista del calcolo, inoltre il confronto di ogni campo per determinarne l'uguaglianza potrebbe essere superfluo. Se si prevede che gli utenti confrontino o ordinino le istanze oppure le utilizzino come chiavi di tabelle hash, il tipo di valore deve implementare Equals.
CA1816: Chiamare GC.SuppressFinalize correttamente Un metodo che è un'implementazione di Dispose non chiama GC. Suppressfinalize; o un metodo che non è un'implementazione di Dispose chiama GC. Suppressfinalize; o un metodo chiama GC. SuppressFinalize e passa qualcosa di diverso da questo (Me in Visual Basic).
CA1819: Le proprietà non devono restituire matrici Le matrici restituite dalle proprietà non sono protette in scrittura, anche se la proprietà è in sola lettura. Affinché la matrice sia protetta da eventuali alterazioni, la proprietà deve restituire una copia della matrice. In genere, gli utenti non comprendono le implicazioni negative sulle prestazioni derivanti dalla chiamata di tale proprietà.
CA1820: Testare le stringhe vuote usando la lunghezza di stringa Il confronto tra stringhe mediante la proprietà String.Length o il metodo String.IsNullOrEmpty è notevolmente più veloce rispetto all'utilizzo di Equals.
CA1821: Rimuovere i finalizzatori vuoti Quando possibile, evitare di utilizzare i finalizzatori per non sovraccaricare ulteriormente le prestazioni durante il rilevamento della durata dell'oggetto. Un finalizzatore vuoto provoca un sovraccarico aggiuntivo e non fornisce alcun vantaggio.
CA1822: Contrassegna i membri come statici I membri che non accedono ai dati dell'istanza o chiamano i metodi dell'istanza possono essere contrassegnati come statici (Condivisi in Visual Basic). Tramite il compilatore verranno quindi inviati siti di chiamata non virtuali a tali membri. Si potrà così ottenere un sensibile miglioramento delle prestazioni per codici sensibili alle prestazioni.
CA1823: Evitare campi privati non usati Sono stati rilevati campi privati che non sembrano essere utilizzati all'interno dell'assembly.
CA1824: Contrassegnare gli assembly con NeutralResourcesLanguageAttribute L'attributo NeutralResourcesLanguage informa il gestore risorse della lingua usata per visualizzare le risorse di impostazioni cultura neutre per un assembly. Tale approccio migliora le prestazioni delle ricerche per la prima risorsa caricata e riduce il working set.
CA1825: Evitare allocazioni di matrici di lunghezza zero L'inizializzazione di una matrice di lunghezza zero comporta l'allocazione di memoria non necessaria. Usare invece l'istanza di matrice vuota allocata in modo statico chiamando Array.Empty. L'allocazione di memoria viene condivisa tra tutte le chiamate di questo metodo.
CA1826: Utilizzare la proprietà anziché il metodo Linq Enumerable Enumerable Il metodo LINQ è stato usato in un tipo che supporta una proprietà equivalente ed efficiente.
CA1827: Non usare Count/LongCount quando è possibile usare Any Count o LongCount è stato usato il metodo in cui Any il metodo sarebbe più efficiente.
CA1828: Non usare CountAsync/LongCountAsync quando è possibile usare AnyAsync CountAsync o LongCountAsync è stato usato il metodo in cui AnyAsync il metodo sarebbe più efficiente.
CA1829: Utilizzare la proprietà Length/Count anziché il metodo Enumerable.Count Count Il metodo LINQ è stato usato in un tipo che supporta un oggetto equivalente, più efficiente Length o Count proprietà.
CA1830: preferisce overload di metodo Append e Insert fortemente tipizzato in StringBuilder Append e Insert forniscono overload per più tipi oltre String. Quando possibile, preferire gli overload fortemente tipizzato rispetto all'uso di ToString() e dell'overload basato su stringhe.
CA1831: usare AsSpan anziché indicizzatori basati su intervallo per la stringa quando appropriato Quando si usa un indicizzatore di intervallo in una stringa e si assegna in modo implicito il valore al tipo char ReadOnlySpan<, il metodo Substring verrà usato invece di Slice, che produce una copia della parte richiesta della stringa.>
CA1832: usare AsSpan o AsMemory anziché indicizzatori basati su range per ottenere la parte ReadOnlySpan o ReadOnlyMemory di una matrice Quando si usa un indicizzatore di intervallo in una matrice e si assegna in modo implicito il valore a un ReadOnlySpan<T> tipo o ReadOnlyMemory<T> , il metodo GetSubArray verrà usato invece di Slice, che produce una copia della parte richiesta della matrice.
CA1833: usare AsSpan o AsMemory invece di indicizzatori basati su intervallo per ottenere la parte Span o Memory di una matrice Quando si usa un indicizzatore di intervallo in una matrice e si assegna in modo implicito il valore a un Span<T> tipo o Memory<T> , il metodo GetSubArray verrà usato invece di Slice, che produce una copia della parte richiesta della matrice.
CA1834: Usare StringBuilder.Append(char) per stringhe di caratteri singoli StringBuilder ha un Append overload che accetta come char argomento . Preferisce chiamare l'overload char per motivi di prestazioni.
CA1835: preferisce gli overload basati sulla memoria per 'ReadAsync' e 'WriteAsync' 'Stream' ha un overload 'ReadAsync' che accetta un 'Memory<Byte>' come primo argomento e un overload 'WriteAsync' che accetta un byte> 'ReadOnlyMemory<' come primo argomento. Preferisce chiamare gli overload basati sulla memoria, che sono più efficienti.
CA1836: Preferire IsEmpty se Count disponibile Preferisce IsEmpty una proprietà più efficiente di Count, LengthCount<TSource>(IEnumerable<TSource>) o LongCount<TSource>(IEnumerable<TSource>) per determinare se l'oggetto contiene o meno elementi.
CA1837: Usare Environment.ProcessId invece di Process.GetCurrentProcess().Id Environment.ProcessId è più semplice e veloce di Process.GetCurrentProcess().Id.
CA1838: Evitare StringBuilder parametri per P/Invoke Il marshalling di "StringBuilder" crea sempre una copia del buffer nativa, generando più allocazioni per un'operazione di marshalling.
CA1839: usare Environment.ProcessPath anziché Process.GetCurrentProcess(). MainModule.FileName Environment.ProcessPath è più semplice e veloce di Process.GetCurrentProcess().MainModule.FileName.
CA1840: usare Environment.CurrentManagedThreadId anziché Thread.CurrentThread.ManagedThreadId Environment.CurrentManagedThreadId è più compatto ed efficiente di Thread.CurrentThread.ManagedThreadId.
CA1841: Prefer Dictionary Contains methods La chiamata Contains alla Keys raccolta o Values può spesso essere più costosa rispetto alla chiamata ContainsKey o ContainsValue al dizionario stesso.
CA1842: Non usare 'WhenAll' con una singola attività L'uso WhenAll di con una singola attività può comportare una perdita di prestazioni. Attendere o restituire l'attività.
CA1843: Non usare 'WaitAll' con una singola attività L'uso WaitAll di con una singola attività può comportare una perdita di prestazioni. Attendere o restituire l'attività.
CA1844: fornire sostituzioni basate sulla memoria dei metodi asincroni quando si sottoclassa 'Stream' Per migliorare le prestazioni, eseguire l'override dei metodi asincroni basati sulla memoria durante la sottoclasse di "Stream". Implementare quindi i metodi basati su matrice in termini di metodi basati sulla memoria.
CA1845: usare la stringa basata su span. Concat' È più efficiente usare AsSpan e string.Concat, anziché e un operatore di Substring concatenazione.
CA1846: Preferisce AsSpan rispetto a Substring AsSpan è più efficiente di Substring. Substring esegue una copia stringa O(n), mentre AsSpan non ha un costo costante. AsSpan inoltre non esegue alcuna allocazione dell'heap.
CA1847: Usare un valore letterale char per una singola ricerca di caratteri Usare string.Contains(char) invece di string.Contains(string) quando si cerca un singolo carattere.
CA1848: Usare i delegati LoggerMessage Per migliorare le prestazioni, usare i LoggerMessage delegati.
CA1849: Chiamare metodi asincroni quando si trova in un metodo asincrono In un metodo che è già asincrono, le chiamate ad altri metodi devono essere alle versioni asincrone, dove esistono.
CA1850: Preferisce il metodo statico HashData rispetto a ComputeHash È più efficiente usare il metodo statico HashData per creare e gestire un'istanza HashAlgorithm di per chiamare ComputeHash.
CA1851: Possibili enumerazioni multiple della raccolta IEnumerable Possibili enumerazioni multiple di IEnumerable raccolta. Prendere in considerazione l'uso di un'implementazione che evita più enumerazioni.
CA1852: Sigillare i tipi interni Tipo non accessibile all'esterno dell'assembly e senza sottotipi all'interno dell'assembly contenitore non bloccato.
CA1853: chiamata non necessaria a 'Dictionary.ContainsKey(key)' Non c'è bisogno di proteggere Dictionary.Remove(key) con Dictionary.ContainsKey(key). Dictionary<TKey,TValue>.Remove(TKey) controlla già se la chiave esiste e non genera un'eccezione se non esiste.
CA1854: preferisce il metodo 'IDictionary.TryGetValue(TKey, out TValue)' Preferisce 'TryGetValue' rispetto a un indicizzatore di dizionario sorvegliato da un controllo 'ContainsKey'. 'ContainsKey' e l'indicizzatore cercano entrambe la chiave, quindi l'uso di 'TryGetValue' evita la ricerca aggiuntiva.
CA1855: usare span<T>. Clear() anziché Span<T>. Fill() È più efficiente chiamare che chiamare Span<T>.Clear()Span<T>.Fill(T) per riempire gli elementi dell'intervallo con un valore predefinito.
CA1856: Utilizzo non corretto dell'attributo ConstantExpected L'attributo ConstantExpectedAttribute non viene applicato correttamente a un parametro.
CA1857: Il parametro prevede una costante per ottenere prestazioni ottimali Un argomento non valido viene passato a un parametro annotato con ConstantExpectedAttribute.
CA1858: Usare StartsWith anziché IndexOf È più efficiente chiamare che chiamare String.StartsWithString.IndexOf per verificare se una stringa inizia con un prefisso specificato.
CA1859: Usare tipi concreti quando possibile per migliorare le prestazioni Il codice usa tipi di interfaccia o tipi astratti, causando chiamate di interfaccia non necessarie o chiamate virtuali.
CA1860: Evitare di usare il metodo di estensione 'Enumerable.Any()' È più efficiente e più chiaro usare Length, Counto IsEmpty (se possibile) che chiamare Enumerable.Any per determinare se un tipo di raccolta contiene elementi.
CA1861: Evitare matrici costanti come argomenti Le matrici costanti passate come argomenti non vengono riutilizzate, il che implica un sovraccarico delle prestazioni. Per migliorare le prestazioni, è consigliabile estrarle nei campi 'static readonly'.
CA1862: Usare gli overload del metodo 'StringComparison' per eseguire confronti di stringhe senza distinzione tra maiuscole e minuscole Quando il codice chiama ToLower() o ToUpper() per eseguire un confronto tra stringhe senza distinzione tra maiuscole e minuscole, viene eseguita un'allocazione non necessaria.
CA1863: Usare 'CompositeFormat' Per ridurre i costi di formattazione, memorizzare nella cache e usare un'istanza CompositeFormat come argomento in String.Format o StringBuilder.AppendFormat.
CA1864: preferisce il metodo 'IDictionary.TryAdd(TKey, TValue)' Sia Dictionary<TKey,TValue>.ContainsKey(TKey) che eseguono Dictionary<TKey,TValue>.Add una ricerca, che è ridondante. È più efficiente chiamare Dictionary<TKey,TValue>.TryAdd, che restituisce un bool valore che indica se il valore è stato aggiunto o meno. TryAdd non sovrascrive il valore della chiave se la chiave è già presente.
CA1865-CA1867: Usare l'overload char L'overload char è un overload con prestazioni migliori per una stringa con un singolo carattere.
CA1868: chiamata non necessaria a 'Contains' per i set Sia ISet<T>.Add(T) che eseguono ICollection<T>.Remove(T) una ricerca, che lo rende ridondante per chiamare ICollection<T>.Contains(T) in anticipo. È più efficiente chiamare Add(T) o Remove(T) direttamente, che restituisce un valore booleano che indica se l'elemento è stato aggiunto o rimosso.
CA1869: Memorizzare nella cache e riutilizzare le istanze di 'JsonSerializerOptions' L'uso di un'istanza locale di JsonSerializerOptions per la serializzazione o la deserializzazione può ridurre notevolmente le prestazioni dell'applicazione se il codice viene eseguito più volte, poiché System.Text.Json memorizza internamente nella cache i metadati correlati alla serializzazione nell'istanza specificata.
CA1870: Usare un'istanza di 'SearchValues' memorizzata nella cache L'uso di un'istanza memorizzata nella SearchValues<T> cache è più efficiente rispetto al passaggio diretto dei valori a 'IndexOfAny' o 'ContainsAny'.
CA1871: Non passare uno struct nullable a 'ArgumentNullException.ThrowIfNull' 'ArgumentNullException.ThrowIfNull' accetta un 'oggetto', quindi il passaggio di uno struct nullable potrebbe causare la conversione boxing del valore.
CA1872: preferisce 'Convert.ToHexString' e 'Convert.ToHexStringLower' rispetto alle catene di chiamate basate su 'BitConverter.ToString' Usare Convert.ToHexString o Convert.ToHexStringLower quando si codificano byte in una rappresentazione di stringa esadecimale. Questi metodi sono più efficienti e descrittivi per l'allocazione rispetto all'uso BitConverter.ToString in combinazione con String.Replace per sostituire i trattini e String.ToLower.
CA2000: Eliminare gli oggetti prima di perdere l'ambito Poiché è possibile che si verifichi un evento eccezionale che impedisca l'esecuzione del finalizzatore di un oggetto, è opportuno eliminare in modo esplicito l'oggetto prima che tutti i riferimenti a tale oggetto siano esterni all'ambito.
CA2002: Non bloccare oggetti con identità debole Un oggetto presenta un'identità debole quando è possibile accedere ad esso direttamente attraverso i confini dei domini applicazione. Un thread che tenta di acquisire un blocco su un oggetto con identità debole può essere bloccato da un secondo thread in un altro dominio applicazione con un blocco sullo stesso oggetto.
CA2007: Non attendere direttamente un'attività Un metodo asincrono attende direttamente un oggetto Task . Quando un metodo asincrono attende direttamente un Task oggetto , la continuazione si verifica nello stesso thread che ha creato l'attività. Questo comportamento può essere costoso in termini di prestazioni e può comportare un deadlock nel thread dell'interfaccia utente. Valutare la possibilità di chiamare Task.ConfigureAwait(Boolean) per segnalare l'intenzione di continuare.
CA2008: Non creare attività senza passare un TaskScheduler Un'operazione di creazione o continuazione di un'attività usa un overload del metodo che non specifica un TaskScheduler parametro.
CA2009: Non chiamare ToImmutableCollection su un valore ImmutableCollection ToImmutable il metodo è stato chiamato inutilmente su una raccolta non modificabile dallo System.Collections.Immutable spazio dei nomi.
CA2011: Non assegnare la proprietà all'interno del setter A una proprietà è stato assegnato accidentalmente un valore all'interno della propria funzione di accesso set.
CA2012: Usare Correttamente ValueTasks I ValoriTask restituiti dalle chiamate ai membri devono essere attesi direttamente. I tentativi di utilizzare un valore ValueTask più volte o di accedere direttamente al risultato di uno prima che sia noto che venga completato possono causare un'eccezione o un danneggiamento. Ignorare tale ValueTask è probabilmente un'indicazione di un bug funzionale e può compromettere le prestazioni.
CA2013: Non usare ReferenceEquals con tipi valore Quando si confrontano i valori usando System.Object.ReferenceEquals, se objA e objB sono tipi valore, vengono inseriti nella casella prima che vengano passati al ReferenceEquals metodo . Ciò significa che anche se sia objA che objB rappresentano la stessa istanza di un tipo valore, il ReferenceEquals metodo restituisce comunque false.
CA2014: non usare stackalloc nei cicli. Lo spazio dello stack allocato da uno stackalloc viene rilasciato solo alla fine della chiamata del metodo corrente. L'uso in un ciclo può comportare una crescita dello stack non associato e condizioni di overflow dello stack finale.
CA2015: Non definire i finalizzatori per i tipi derivati da MemoryManager<T> L'aggiunta di un finalizzatore a un tipo derivato da MemoryManager<T> può consentire la liberazione della memoria mentre è ancora in uso da un oggetto Span<T>.
CA2016: inoltrare il parametro CancellationToken ai metodi che accettano uno Inoltrare il CancellationToken parametro ai metodi che accettano uno per assicurarsi che le notifiche di annullamento dell'operazione vengano propagate correttamente o passate CancellationToken.None in modo esplicito per indicare intenzionalmente di non propagare il token.
CA2017: Mancata corrispondenza del conteggio dei parametri Il numero di parametri forniti nel modello di messaggio di registrazione non corrisponde al numero di segnaposto denominati.
CA2018: count argomento da specificare Buffer.BlockCopy il numero di byte da copiare Quando si usa Buffer.BlockCopy, l'argomento count specifica il numero di byte da copiare. È consigliabile usare Array.Length solo per l'argomento count sulle matrici i cui elementi sono esattamente di un byte. byteLe matrici , sbytee bool hanno elementi di dimensioni pari a un byte.
CA2019: I campi ThreadStatic non devono usare l'inizializzazione inline Un campo con ThreadStaticAttribute annotazioni viene inizializzato inline o in modo esplicito in un static costruttore (Shared in Visual Basic).
CA2020: Impedire la modifica comportamentale causata dagli operatori predefiniti di IntPtr/UIntPtr Alcuni operatori predefiniti aggiunti in .NET 7 si comportano in modo diverso rispetto agli operatori definiti dall'utente in .NET 6 e versioni precedenti. Alcuni operatori usati per generare un contesto non controllato durante l'overflow non generano più un'eccezione a meno che non venga eseguito il wrapping all'interno del contesto selezionato. Alcuni operatori che in precedenza non generavano nel contesto controllato ora generano un'eccezione a meno che non venga eseguito il wrapping all'interno di un contesto deselezionato.
CA2021: Non chiamare Enumerable.Cast<T> o Enumerable.OfType<T> con tipi incompatibili Una chiamata a Enumerable.Cast<TResult>(IEnumerable) o Enumerable.OfType<TResult>(IEnumerable) specifica un parametro di tipo non compatibile con il tipo della raccolta di input.
CA2100: Controllare la vulnerabilità della sicurezza nelle query SQL Un metodo imposta la proprietà System.Data.IDbCommand.CommandText usando una stringa compilata da un argomento stringa nel metodo. La regola presuppone che l'argomento stringa contenga l'input dell'utente. Una stringa di comando SQL compilata da un input dell'utente è vulnerabile agli attacchi intrusivi nel codice SQL,
CA2101: Specificare il marshalling per gli argomenti stringa P/Invoke Un membro di platform invoke consente i chiamanti parzialmente attendibili, presenta un parametro di stringa e non effettua il marshalling della stringa. Questo può comportare una potenziale vulnerabilità di sicurezza.
CA2109: Controllare i gestori di eventi visibili È stato rilevato un metodo di gestione eventi pubblico o protetto. I metodi di gestione eventi non devono essere esposti se non assolutamente necessario.
CA2119: Impostare come sealed i metodi che soddisfano interfacce private Un tipo pubblico ereditabile fornisce un'implementazione di metodo sottoponibile a override di un'interfaccia interna (Friend in Visual Basic). Per correggere una violazione di questa regola, impedire che venga eseguito l'override del metodo esternamente all'assembly.
CA2153: Evitare di gestire eccezioni di stato danneggiate Le eccezioni dello stato danneggiato (C edizione Standard s) indicano che il danneggiamento della memoria esiste nel processo. Se si prova a intercettare tali eccezioni, invece di lasciare che il processo venga arrestato in modo anomalo, può portare a vulnerabilità di sicurezza nel caso in cui un utente malintenzionato riesca a inserire un exploit nell'area della memoria danneggiata.
CA2200: Eseguire il rethrow per mantenere i dettagli dello stack Viene generata di nuovo un'eccezione, specificata in modo esplicito nell'istruzione throw. Se un'eccezione viene generata di nuovo tramite la specifica nell'istruzione throw, l'elenco di chiamate ai metodi tra il metodo originale che ha generato l'eccezione e il metodo corrente viene perso.
CA2201: Non generare tipi di eccezione riservati Tale circostanza complica il rilevamento e il debug dell'errore originale.
CA2207: Inizializzare i campi statici dei tipi di valore inline Un tipo di valore dichiara un costruttore statico esplicito. Per correggere una violazione di questa regola, inizializzare tutti i dati statici quando vengono dichiarati e rimuovere il costruttore statico.
CA2208: Creare istanze di eccezioni di argomento correttamente Viene effettuata una chiamata al costruttore predefinito (senza parametri) di un tipo di eccezione che corrisponde a o deriva da ArgumentException oppure viene passato un argomento stringa non corretto a un costruttore con parametri di un tipo di eccezione che corrisponde a o deriva da ArgumentException.
CA2211: I campi non costanti non devono essere visibili I campi statici che non sono costanti né in sola lettura non sono thread-safe. L'accesso a tali campi deve essere controllato attentamente e richiede tecniche di programmazione avanzate per la sincronizzazione dell'accesso all'oggetto classe.
CA2213: I campi Disposable devono essere eliminati Un tipo che implementa System.IDisposable dichiara i campi di tipi che implementano anch'essi IDisposable. Il metodo Dispose del campo non viene chiamato dal metodo Dispose del tipo dichiarante.
CA2214: Non chiamare metodi sottoponibili a override nei costruttori Quando un costruttore chiama un metodo virtuale, è possibile che il costruttore per l'istanza che richiama il metodo non sia stato eseguito.
CA2215: I metodi Dispose devono chiamare il metodo Dispose della classe base Se un tipo eredita da un tipo eliminabile, deve chiamare il metodo Dispose del tipo di base dal proprio metodo Dispose.
CA2216: I tipi Disposable devono dichiarare un finalizzatore Un tipo che implementa System.IDisposable e include campi che suggeriscono l'utilizzo di risorse non gestite non implementa un finalizzatore, come descritto da Object.Finalize.
CA2217: Non contrassegnare le enumerazioni con FlagsAttribute Un'enumerazione visibile esternamente è contrassegnata utilizzando FlagsAttribute e presenta uno o più valori che non sono potenze di due o una combinazione degli altri valori definiti nell'enumerazione.
CA2218: Eseguire l'override di GetHashCode all'override di Equals Un tipo pubblico esegue l'override System.Object.Equals di ma non esegue l'override System.Object.GetHashCodedi .
CA2219: Non generare eccezioni in clausole di eccezione Quando un'eccezione viene generata in una clausola finally o in una clausola fault, la nuova eccezione nasconde l'eccezione attiva. Quando viene generata un'eccezione in una clausola di filtro, il runtime rileva automaticamente l'eccezione. Tale circostanza complica il rilevamento e il debug dell'errore originale.
CA2224: Eseguire l'override di Equals all'override dell'operatore Un tipo pubblico implementa l'operatore di uguaglianza ma non esegue l'override di System.Object.Equals.
CA2225: Gli overload degli operatori hanno alternative con nome È stato rilevato un overload di operatore e il metodo alternativo denominato previsto non è stato trovato. Il membro alternativo denominato fornisce accesso alla stessa funzionalità dell'operatore e viene fornito per gli sviluppatori che programmano in linguaggi che non supportano operatori di overload.
CA2226: Gli operatori devono avere overload simmetrici Un tipo implementa l'operatore di uguaglianza o di disuguaglianza e non implementa l'operatore opposto.
CA2227: Le proprietà di raccolte devono essere in sola lettura Una proprietà di raccolta scrivibile consente a un utente di sostituire la raccolta con una raccolta diversa. Una proprietà di sola lettura interrompe la sostituzione della raccolta ma consente ancora l'impostazione dei singoli membri.
CA2229: Implementare costruttori di serializzazione Per correggere una violazione di questa regola, implementare il costruttore di serializzazione. Per una classe sealed, rendere il costruttore privato; in caso contrario renderlo protetto.
CA2231: Eseguire l'overload dell'operatore "uguale a" all'override di ValueType.Equals Un tipo di valore esegue l'override di Object.Equals, ma non implementa l'operatore di uguaglianza.
CA2234: Passare oggetti System.Uri invece di stringhe Viene effettuata una chiamata a un metodo che dispone di un parametro di stringa il cui nome contiene "uri", "URI", "urn", "URN", "url" o "URL". Il tipo dichiarante del metodo contiene un overload del metodo corrispondente con un parametro System.Uri.
CA2235: Contrassegnare tutti i campi non serializzabili Un campo di istanza di un tipo non serializzabile viene dichiarato in un tipo serializzabile.
CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute Affinché i tipi vengano riconosciuti come serializzabili in Common Language Runtime, è necessario che siano contrassegnati utilizzando l'attributo SerializableAttribute anche quando utilizzano una routine di serializzazione personalizzata tramite l'implementazione dell'interfaccia ISerializable.
CA2241: Specificare argomenti corretti ai metodi di formattazione L'argomento format passato a System.String.Format non contiene un elemento di formato corrispondente a ogni argomento dell'oggetto o viceversa.
CA2242: Testare i valori NaN in modo corretto Questa espressione consente di testare un valore rispetto a Single.Nan o Double.Nan. Utilizzare Single.IsNan(Single) o Double.IsNan(Double) per testare il valore.
CA2243: Valori letterali stringa di attributo devono essere analizzate correttamente Il parametro del valore letterale stringa di un attributo non esegue l'analisi corretta di un URL, un GUID o una versione.
CA2244: Non duplicare le inizializzazioni degli elementi indicizzati Un inizializzatore di oggetto ha più di un inizializzatore di elementi indicizzati con lo stesso indice costante. Tutto ma l'ultimo inizializzatore è ridondante.
CA2245: Non assegnare una proprietà a se stessa Una proprietà è stata assegnata accidentalmente a se stessa.
CA2246: Non assegnare un simbolo e il relativo membro nella stessa istruzione Non è consigliabile assegnare un simbolo e il relativo membro, ovvero un campo o una proprietà, nella stessa istruzione. Non è chiaro se l'accesso al membro è stato progettato per usare il valore precedente del simbolo prima dell'assegnazione o il nuovo valore dell'assegnazione in questa istruzione.
CA2247: l'argomento passato al costruttore TaskCompletionSource deve essere l'enumerazione TaskCreationOptions anziché l'enumerazione TaskContinuationOptions. TaskCompletionSource include costruttori che accettano TaskCreationOptions che controllano l'attività sottostante e i costruttori che accettano lo stato dell'oggetto archiviato nell'attività. Se si passa accidentalmente taskContinuationOptions anziché taskCreationOptions, la chiamata considera le opzioni come stato.
CA2248: Specificare l'argomento di enumerazione corretto per Enum.HasFlag Il tipo di enumerazione passato come argomento alla chiamata al HasFlag metodo è diverso dal tipo di enumerazione chiamante.
CA2249: prendere in considerazione l'uso di String.Contains invece di String.IndexOf Le chiamate a string.IndexOf dove viene usato il risultato per verificare la presenza o l'assenza di una sottostringa possono essere sostituite da string.Contains.
CA2250: Usare ThrowIfCancellationRequested ThrowIfCancellationRequested controlla automaticamente se il token è stato annullato e genera un'eccezione OperationCanceledException se è presente.
CA2251: Usare String.Equals over String.Compare È sia più chiaro che probabilmente più veloce da usare String.Equals invece di confrontare il risultato di String.Compare a zero.
CA2252: Acconsentire esplicitamente alle funzionalità di anteprima Acconsentire esplicitamente alle funzionalità di anteprima prima di usare le API di anteprima.
CA2253: i segnaposto denominati non devono essere valori numerici I segnaposto denominati nel modello di messaggio di registrazione non devono essere costituiti solo da caratteri numerici.
CA2254: Il modello deve essere un'espressione statica Il modello di messaggio di registrazione non deve variare tra le chiamate.
CA2255: L'attributo ModuleInitializer non deve essere usato nelle librerie Gli inizializzatori di modulo devono essere usati dal codice dell'applicazione per assicurarsi che i componenti di un'applicazione vengano inizializzati prima che il codice dell'applicazione inizi l'esecuzione.
CA2256: tutti i membri dichiarati nelle interfacce padre devono avere un'implementazione in un'interfaccia con attributi DynamicInterfaceCastableImplementation Tipi con attributi che DynamicInterfaceCastableImplementationAttribute fungono da implementazione dell'interfaccia per un tipo che implementa il IDynamicInterfaceCastable tipo . Di conseguenza, deve fornire un'implementazione di tutti i membri definiti nelle interfacce ereditate, perché il tipo che implementa IDynamicInterfaceCastable non li fornirà altrimenti.
CA2257: i membri definiti in un'interfaccia con 'DynamicInterfaceCastableImplementationAttribute' devono essere 'statici' Poiché un tipo che implementa IDynamicInterfaceCastable potrebbe non implementare un'interfaccia dinamica nei metadati, è probabile che le chiamate a un membro dell'interfaccia dell'istanza che non sia un'implementazione esplicita definita in questo tipo non riescano in fase di esecuzione. Contrassegnare i nuovi membri static dell'interfaccia per evitare errori di runtime.
CA2258: La fornitura di un'interfaccia 'DynamicInterfaceCastableImplementation' in Visual Basic non è supportata Per fornire un'interfaccia funzionale DynamicInterfaceCastableImplementationAttributecon attributi è necessaria la funzionalità Membri interfaccia predefinita, non supportata in Visual Basic.
CA2259: Assicurarsi che ThreadStatic venga usato solo con i campi statici ThreadStaticAttribute influisce solo sui static campi (Shared in Visual Basic). Se applicato ai campi dell'istanza, l'attributo non ha alcun impatto sul comportamento.
CA2260: Implementare correttamente interfacce matematiche generiche Le interfacce matematiche generiche richiedono che il tipo derivato stesso venga usato per il parametro di tipo ricorrente.
CA2261: Non usare ConfigureAwaitOptions.SuppressThrowing con Task<TResult> L'opzione ConfigureAwaitOptions.SuppressThrowing non è supportata dall'oggetto generico Task<TResult>, perché potrebbe causare la restituzione di un oggetto non valido TResult.
CA2262: Impostare MaxResponseHeadersLength correttamente Assicurarsi che il MaxResponseHeadersLength valore sia specificato correttamente. Questo valore viene misurato in kilobyte.
CA2263: preferire overload generico quando il tipo è noto L'uso di un overload generico è preferibile passare un System.Type argomento quando il tipo è noto, perché promuove codice più pulito e più indipendente dai tipi con controlli in fase di compilazione migliorati.
CA2264: Non passare un valore non nullable a 'ArgumentNullException.ThrowIfNull' 'ArgumentNullException.ThrowIfNull' genera quando l'argomento passato è 'null'. Alcuni costrutti come struct non nullable e 'nameof()' e 'new' espressioni non sono mai null, quindi 'ArgumentNullException.ThrowIfNull' non genereranno mai un'eccezione.
CA2300: Non usare un deserializzatore non sicuro BinaryFormatter I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2301: Non chiamare BinaryFormatter.Deserialize senza prima impostare BinaryFormatter.Binder I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2302: Assicurarsi che BinaryFormatter.Binder sia impostato prima di chiamare BinaryFormatter.Deserialize I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2305: Non usare il deserializzatore non sicuro LosFormatter I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2310: Non usare un deserializzatore non sicuro NetDataContractSerializer I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2311: Non deserializzare senza prima impostare NetDataContractSerializer.Binder I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2312: Assicurarsi che NetDataContractSerializer.Binder sia impostato prima della deserializzazione I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2315: Non usare objectStateFormatter deserializer non sicuro I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2321: Non deserializzare con JavaScriptSerializer usando simpleTypeResolver I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2322: Assicurarsi che JavaScriptSerializer non sia inizializzato con SimpleTypeResolver prima della deserializzazione I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2326: Non usare i valori TypeNameHandling diversi da Nessuno I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2327: Non usare JsonSerializer non sicuro Impostazioni I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2328: Assicurarsi che JsonSerializer Impostazioni siano protetti I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2329: Non deserializzare con JsonSerializer usando una configurazione non sicura I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2330: Assicurarsi che JsonSerializer abbia una configurazione sicura durante la deserializzazione I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi.
CA2350: Verificare che l'input di DataTable.ReadXml()sia attendibile Quando si deserializza un oggetto DataTable con input non attendibile, un utente malintenzionato può creare input dannoso per eseguire un attacco Denial of Service. Potrebbero verificarsi vulnerabilità sconosciute per l'esecuzione del codice remoto.
CA2351: Verificare che l'input di DataSet.ReadXml()sia attendibile Quando si deserializza un oggetto DataSet con input non attendibile, un utente malintenzionato può creare input dannoso per eseguire un attacco Denial of Service. Potrebbero verificarsi vulnerabilità sconosciute per l'esecuzione del codice remoto.
CA2352: Unsafe DataSet o DataTable in un tipo serializzabile può essere vulnerabile agli attacchi di esecuzione del codice remoto Una classe o uno struct contrassegnato con SerializableAttribute contiene un campo o una DataSet proprietà o DataTable e non dispone di un oggetto GeneratedCodeAttribute.
CA2353: Unsafe DataSet o DataTable in tipo serializzabile Una classe o uno struct contrassegnato con un attributo di serializzazione XML o un attributo del contratto dati contiene un campo o DataTable una DataSet proprietà o .
CA2354: Unsafe DataSet o DataTable nell'oggetto grafico deserializzato può essere vulnerabile all'attacco di esecuzione del codice remoto La deserializzazione con un System.Runtime.Serialization.IFormatter oggetto serializzato e l'oggetto grafico del tipo sottoposto a cast può includere un DataSet oggetto o DataTable.
CA2355: Unsafe DataSet o DataTable in un oggetto grafico deserializzato Deserializzazione quando il grafico a oggetti del tipo sottoposto a cast o specificato può includere un DataSet oggetto o DataTable.
CA2356: Unsafe DataSet o DataTable in web deserialized object graph Un metodo con un System.Web.Services.WebMethodAttribute oggetto o System.ServiceModel.OperationContractAttribute ha un parametro che può fare riferimento a un DataSet oggetto o DataTable.
CA2361: Verificare che la classe generata automaticamente contenente DataSet.ReadXml() non venga usata con dati non attendibili Quando si deserializza un oggetto DataSet con input non attendibile, un utente malintenzionato può creare input dannoso per eseguire un attacco Denial of Service. Potrebbero verificarsi vulnerabilità sconosciute per l'esecuzione del codice remoto.
CA2362: Unsafe DataSet o DataTable in un tipo serializzabile generato automaticamente può essere vulnerabile agli attacchi di esecuzione del codice remoto Quando si deserializzare l'input non attendibile con BinaryFormatter e l'oggetto grafico deserializzato contiene un DataSet oggetto o DataTable, un utente malintenzionato può creare un payload dannoso per eseguire un attacco di esecuzione del codice remoto.
CA3001: Esaminare il codice per individuare le vulnerabilità di sql injection Quando si lavora con i comandi SQL e di input non attendibili, tenere presente gli attacchi SQL injection. Un attacco SQL injection può eseguire comandi SQL dannosi, compromettendo la sicurezza e l'integrità dell'applicazione.
CA3002: Esaminare il codice per le vulnerabilità XSS Quando si usa l'input non attendibile dalle richieste Web, tenere presente gli attacchi XSS (Cross-Site Scripting). Un attacco XSS inserisce input non attendibile nell'output HTML non elaborato, consentendo all'utente malintenzionato di eseguire script dannosi o di modificare il contenuto nella pagina Web.
CA3003: Esaminare il codice per individuare le vulnerabilità di inserimento del percorso del file Quando si usa l'input non attendibile dalle richieste Web, tenere presente l'uso dell'input controllato dall'utente quando si specificano i percorsi dei file.
CA3004: Esaminare il codice per individuare le vulnerabilità di divulgazione di informazioni La divulgazione delle informazioni sulle eccezioni offre agli utenti malintenzionati informazioni dettagliate sugli interni dell'applicazione, che possono aiutare gli utenti malintenzionati a trovare altre vulnerabilità da sfruttare.
CA3005: Esaminare il codice per le vulnerabilità di inserimento LDAP Quando si usa l'input non attendibile, tenere presente gli attacchi ldap (Lightweight Directory Access Protocol). Un utente malintenzionato può eseguire istruzioni LDAP dannose nelle directory delle informazioni. Le applicazioni che usano l'input utente per costruire istruzioni LDAP dinamiche per accedere ai servizi directory sono particolarmente vulnerabili.
CA3006: Esaminare il codice per individuare le vulnerabilità di inserimento dei comandi di processo Quando si lavora con l'input non attendibile, tenere presente gli attacchi di inserimento dei comandi. Un attacco command injection può eseguire comandi dannosi nel sistema operativo sottostante, compromettendo la sicurezza e l'integrità del server.
CA3007: Esaminare il codice per individuare vulnerabilità di reindirizzamento aperte Quando si lavora con l'input non attendibile, tenere presente le vulnerabilità di reindirizzamento aperte. Un utente malintenzionato può sfruttare una vulnerabilità di reindirizzamento aperto per usare il sito Web per dare l'aspetto di un URL legittimo, ma reindirizzare un visitatore insospettabile a una pagina Web dannosa o di phishing.
CA3008: Esaminare il codice per le vulnerabilità di inserimento XPath Quando si lavora con l'input non attendibile, tenere presente gli attacchi di inserimento XPath. La creazione di query XPath usando un input non attendibile può consentire a un utente malintenzionato di modificare la query per restituire un risultato imprevisto ed eventualmente divulgare il contenuto del codice XML sottoposto a query.
CA3009: Esaminare il codice per individuare le vulnerabilità di inserimento XML Quando si usa l'input non attendibile, tenere presente gli attacchi XML injection.
CA3010: Esaminare il codice per individuare le vulnerabilità di inserimento XAML Quando si lavora con l'input non attendibile, tenere presente gli attacchi xaml injection. XAML è un linguaggio di markup che rappresenta direttamente la creazione di istanze di oggetti e la relativa esecuzione. Ciò significa che gli elementi creati in XAML possono interagire con le risorse di sistema (ad esempio, l'accesso alla rete e l'I/O del file system).
CA3011: Esaminare il codice per individuare le vulnerabilità di inserimento delle DLL Quando si usa l'input non attendibile, tenere presente il caricamento di codice non attendibile. Se l'applicazione Web carica codice non attendibile, un utente malintenzionato potrebbe essere in grado di inserire DLL dannose nel processo ed eseguire codice dannoso.
CA3012: Esaminare il codice per individuare vulnerabilità regex injection Quando si lavora con l'input non attendibile, tenere presente gli attacchi regex injection. Un utente malintenzionato può usare l'inserimento regex per modificare in modo dannoso un'espressione regolare, per rendere la corrispondenza regolare risultati imprevisti o per fare in modo che l'espressione regolare utilizzi una CPU eccessiva con conseguente attacco Denial of Service.
CA3061: Non aggiungere lo schema in base all'URL Non usare l'overload unsafe del metodo Add perché può causare riferimenti esterni pericolosi.
CA3075: Elaborazione DTD non protetta Se si usano istanze di DTDProcessing non protette o si fa riferimento a origini di entità esterne, il parser può accettare un input non attendibile e divulgare informazioni riservate a utenti malintenzionati.
CA3076: Esecuzione di script XSLT non protetta Se si eseguono le trasformazioni XSLT (Extensible Stylesheet Language Transformations) nelle applicazioni .NET in modo non sicuro, il processore potrebbe risolvere riferimenti URI non attendibili che potrebbero divulgare informazioni riservate agli utenti malintenzionati, causando attacchi Denial of Service e cross-site.
CA3077: Elaborazione non sicura in progettazione API, documenti XML e lettori di testo XML Quando si progetta un'API derivata da XMLDocument e XMLTextReader, tenere presente DtdProcessing. Se si usano istanze di DTDProcessing non protette per fare riferimento o risolvere origini di entità esterne oppure per impostare valori non protetti nel codice XML, si può causare la divulgazione di informazioni.
CA3147: Contrassegnare i gestori verbi con ValidateAntiForgeryToken Quando si progetta un controller MVC ASP.NET, tenere presente gli attacchi di richiesta intersito falsi. Un attacco di richiesta intersito può inviare richieste dannose da un utente autenticato al controller MVC ASP.NET.
CA5350: non usare algoritmi di crittografia vulnerabili Oggi si usano algoritmi di crittografia e funzioni hash deboli per diversi motivi, ma non dovrebbero essere usati per garantire la riservatezza o l'integrità dei dati che proteggono. Questa regola si attiva quando vengono rilevati algoritmi TripleDES, SHA1 o RIPEMD160 nel codice.
CA5351: Non usare algoritmi di crittografia interrotti Gli algoritmi di crittografia violati non sono considerati sicuri e il loro uso è fortemente sconsigliato. Questa regola si attiva quando nel codice vengono rilevati l'algoritmo hash MD5 oppure gli algoritmi di crittografia DES o RC2.
CA5358: Non usare modalità di crittografia non sicure Non usare modalità crittografia non sicure
CA5359: Non disabilitare la convalida del certificato Un certificato consente di autenticare l'identità del server. I client devono convalidare il certificato del server per assicurarsi che le richieste vengano inviate al server desiderato. Se ServerCertificateValidationCallback restituisce truesempre , qualsiasi certificato passerà la convalida.
CA5360: Non chiamare metodi pericolosi nella deserializzazione La deserializzazione non sicura è una vulnerabilità che si verifica quando i dati non attendibili vengono usati per abusare della logica di un'applicazione, infliggere un attacco Denial of Service (DoS) o persino eseguire codice arbitrario al momento della deserializzazione. È spesso possibile che gli utenti malintenzionati abusino di queste funzionalità di deserializzazione quando l'applicazione deserializzare i dati non attendibili che sono sotto il loro controllo. In particolare, richiamare metodi pericolosi nel processo di deserializzazione. Gli attacchi di deserializzazione non sicuri potrebbero consentire a un utente malintenzionato di eseguire attacchi come attacchi DoS, bypass di autenticazione ed esecuzione remota del codice.
CA5361: Non disabilitare l'uso Schannel di crittografia avanzata L'impostazione Switch.System.Net.DontEnableSchUseStrongCrypto di per indebolire true la crittografia usata nelle connessioni TLS (Transport Layer Security) in uscita. La crittografia più debole può compromettere la riservatezza della comunicazione tra l'applicazione e il server, rendendo più semplice l'intercettazione dei dati sensibili da parte degli utenti malintenzionati.
CA5362: Ciclo di riferimento potenziale nel grafico di oggetti deserializzati Se deserializzare i dati non attendibili, qualsiasi codice che elabora l'oggetto grafico deserializzato deve gestire i cicli di riferimento senza passare a cicli infiniti. Sono inclusi sia il codice che fa parte di un callback di deserializzazione che elabora l'oggetto grafico dopo il completamento della deserializzazione. In caso contrario, un utente malintenzionato potrebbe eseguire un attacco Denial of Service con dati dannosi contenenti un ciclo di riferimento.
CA5363: Non disabilitare la convalida delle richieste La convalida delle richieste è una funzionalità di ASP.NET che esamina le richieste HTTP e determina se contengono contenuto potenzialmente pericoloso che può causare attacchi injection, incluso lo scripting intersito.
CA5364: Non usare protocolli di sicurezza deprecati Transport Layer Security (TLS) protegge la comunicazione tra computer, in genere con PROTOCOLLO HTTPS (Hypertext Transfer Protocol Secure). Le versioni precedenti del protocollo TLS sono meno sicure di TLS 1.2 e TLS 1.3 e hanno maggiori probabilità di avere nuove vulnerabilità. Evitare versioni precedenti del protocollo per ridurre al minimo i rischi.
CA5365: Non disabilitare il controllo dell'intestazione HTTP Il controllo dell'intestazione HTTP abilita la codifica dei caratteri ritorno a capo e di nuova riga, \r e \n, presenti nelle intestazioni di risposta. Questa codifica consente di evitare attacchi injection che sfruttano un'applicazione che restituisce dati non attendibili contenuti nell'intestazione.
CA5366: Usare XmlReader per DataSet Read XML L'uso di un DataSet oggetto per leggere XML con dati non attendibili può caricare riferimenti esterni pericolosi, che devono essere limitati usando un XmlReader oggetto con un sistema di risoluzione sicuro o con l'elaborazione DTD disabilitata.
CA5367: Non serializzare i tipi con campi puntatore Questa regola controlla se è presente una classe serializzabile con un campo o una proprietà puntatore. I membri che non possono essere serializzati possono essere un puntatore, ad esempio membri statici o campi contrassegnati con NonSerializedAttribute.
CA5368: Imposta ViewStateUserKey per le classi derivate dalla pagina L'impostazione della ViewStateUserKey proprietà consente di evitare attacchi all'applicazione consentendo di assegnare un identificatore alla variabile di stato di visualizzazione per singoli utenti in modo che gli utenti malintenzionati non possano usare la variabile per generare un attacco. In caso contrario, ci saranno vulnerabilità per la richiesta intersito falso.
CA5369: Usare XmlReader per deserializzare L'elaborazione di DTD e XML Schema non attendibili può consentire il caricamento di riferimenti esterni pericolosi, che devono essere limitati tramite xmlReader con un sistema di risoluzione sicuro o con LTD e l'elaborazione dello schema inline XML disabilitata.
CA5370: Usare XmlReader per convalidare il lettore L'elaborazione di DTD e XML Schema non attendibili può consentire il caricamento di riferimenti esterni pericolosi. Questo caricamento pericoloso può essere limitato usando un XmlReader con un resolver sicuro o con LTD e l'elaborazione dello schema inline XML disabilitata.
CA5371: Usare XmlReader per la lettura dello schema L'elaborazione di DTD e XML Schema non attendibili può consentire il caricamento di riferimenti esterni pericolosi. L'uso di un XmlReader con un sistema di risoluzione sicuro o con LDD e l'elaborazione dello schema inline XML disabilitata limita questa operazione.
CA5372: Usare XmlReader per XPathDocument L'elaborazione xml da dati non attendibili può caricare riferimenti esterni pericolosi, che possono essere limitati usando un XmlReader con un sistema di risoluzione sicuro o con l'elaborazione DTD disabilitata.
CA5373: Non usare la funzione di derivazione della chiave obsoleta Questa regola rileva la chiamata di metodi System.Security.Cryptography.PasswordDeriveBytes di derivazione chiave debole e Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes utilizzato un algoritmo debole PBKDF1.
CA5374: Non usare XslTransform Questa regola controlla se System.Xml.Xsl.XslTransform viene creata un'istanza nel codice. System.Xml.Xsl.XslTransform è ora obsoleto e non deve essere usato.
CA5375: Non usare la firma di accesso condiviso dell'account Una firma di accesso condiviso dell'account può delegare l'accesso alle operazioni di lettura, scrittura ed eliminazione in contenitori BLOB, tabelle, code e condivisioni file non consentite con una firma di accesso condiviso del servizio. Tuttavia, non supporta i criteri a livello di contenitore e ha meno flessibilità e controllo sulle autorizzazioni concesse. Una volta che gli utenti malintenzionati lo ottengono, l'account di archiviazione verrà compromesso facilmente.
CA5376: Usare SharedAccessProtocol HttpsOnly La firma di accesso condiviso è dati sensibili che non possono essere trasportati in testo normale su HTTP.
CA5377: Usare i criteri di accesso a livello di contenitore I criteri di accesso a livello di contenitore possono essere modificati o revocati in qualsiasi momento. Offre maggiore flessibilità e controllo sulle autorizzazioni concesse.
CA5378: Non disabilitare ServicePointManagerSecurityProtocols L'impostazione di Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols su true limita le connessioni TLS (Transport Layer Security) di Windows Communication Framework (WCF) all'uso di TLS 1.0. Tale versione di TLS sarà deprecata.
CA5379: Non usare l'algoritmo di derivazione chiave debole Per impostazione predefinita, la Rfc2898DeriveBytes classe usa l'algoritmo SHA1 . È necessario specificare l'algoritmo hash da usare in alcuni overload del costruttore con SHA256 o versione successiva. Si noti che HashAlgorithm la proprietà ha solo una get funzione di accesso e non dispone di un overridden modificatore.
CA5380: Non aggiungere certificati all'archivio radice Questa regola rileva il codice che aggiunge un certificato nell'archivio certificati Autorità di certificazione radice attendibili. Per impostazione predefinita, l'archivio certificati Autorità di certificazione radice attendibili è configurato con un set di ca pubbliche che soddisfano i requisiti del programma di certificazione radice Microsoft.
CA5381: Assicurarsi che i certificati non vengano aggiunti all'archivio radice Questa regola rileva il codice che potenzialmente aggiunge un certificato nell'archivio certificati Autorità di certificazione radice attendibili. Per impostazione predefinita, l'archivio certificati Autorità di certificazione radice attendibili è configurato con un set di autorità di certificazione pubbliche (CA) che soddisfano i requisiti del Programma di certificazione radice Microsoft.
CA5382: Usare cookie sicuri in ASP.NET Core Le applicazioni disponibili su HTTPS devono usare cookie sicuri, che indicano al browser che il cookie deve essere trasmesso solo tramite Secure Sockets Layer (SSL).
CA5383: Assicurarsi di usare cookie sicuri in ASP.NET Core Le applicazioni disponibili su HTTPS devono usare cookie sicuri, che indicano al browser che il cookie deve essere trasmesso solo tramite Secure Sockets Layer (SSL).
CA5384: Non usare l'algoritmo di firma digitale (DSA) DSA è un algoritmo di crittografia asimmetrica debole.
CA5385: Usare l'algoritmo Rivest–Shamir–Adleman (RSA) con dimensioni sufficienti della chiave Una chiave RSA inferiore a 2048 bit è più vulnerabile agli attacchi di forza bruta.
CA5386: Evitare il valore SecurityProtocolType hardcoding Transport Layer Security (TLS) protegge la comunicazione tra computer, in genere con PROTOCOLLO HTTPS (Hypertext Transfer Protocol Secure). Le versioni del protocollo TLS 1.0 e TLS 1.1 sono deprecate, mentre TLS 1.2 e TLS 1.3 sono correnti. In futuro, TLS 1.2 e TLS 1.3 potrebbero essere deprecati. Per garantire che l'applicazione rimanga sicura, evitare di impostare come hardcoding una versione del protocollo e di avere come destinazione almeno .NET Framework v4.7.1.
CA5387: Non usare la funzione di derivazione chiave debole con numero di iterazioni insufficienti Questa regola controlla se una chiave crittografica è stata generata da Rfc2898DeriveBytes con un numero di iterazioni inferiore a 100.000. Un numero di iterazioni superiore può contribuire a mitigare gli attacchi di dizionario che tentano di indovinare la chiave crittografica generata.
CA5388: Assicurarsi che il numero di iterazioni sufficiente quando si usa la funzione di derivazione chiave debole Questa regola controlla se una chiave crittografica è stata generata da Rfc2898DeriveBytes con un numero di iterazioni inferiore a 100.000. Un numero di iterazioni superiore può contribuire a mitigare gli attacchi di dizionario che tentano di indovinare la chiave crittografica generata.
CA5389: Non aggiungere il percorso dell'elemento di archivio al percorso del file system di destinazione Il percorso del file può essere relativo e può portare all'accesso al file system all'esterno del percorso di destinazione del file system previsto, causando modifiche di configurazione dannose ed esecuzione remota del codice tramite tecnica di lay-and-wait.
CA5390: Non impostare la chiave di crittografia hardcoded Affinché un algoritmo simmetrico abbia esito positivo, la chiave privata deve essere nota solo al mittente e al ricevitore. Quando una chiave è hardcoded, viene facilmente individuata. Anche con i file binari compilati, è facile per gli utenti malintenzionati estrarlo. Una volta compromessa la chiave privata, il testo crittografato può essere decrittografato direttamente e non è più protetto.
CA5391: Usare token antiforgery nei controller MVC di ASP.NET Core La gestione di una POSTrichiesta , PUT, PATCHo DELETE senza convalidare un token antiforgery può essere vulnerabile agli attacchi falsi di richiesta intersito. Un attacco di richiesta intersito può inviare richieste dannose da un utente autenticato al controller ASP.NET Core MVC.
CA5392: Usare l'attributo DefaultDllImportSearchPaths per P/Invokes Per impostazione predefinita, le funzioni P/Invoke usano DllImportAttribute il probe di una serie di directory, inclusa la directory di lavoro corrente per il caricamento della libreria. Può trattarsi di un problema di sicurezza per determinate applicazioni, causando il dirottamento della DLL.
CA5393: Non usare unsafe Valore DllImportSearchPath Potrebbe essere presente una DLL dannosa nelle directory di ricerca dll predefinite e nelle directory di assembly. In alternativa, a seconda della posizione da cui viene eseguita l'applicazione, potrebbe essere presente una DLL dannosa nella directory dell'applicazione.
CA5394: Non usare casualità non sicura L'uso di un generatore di numeri pseudo-casuali con crittografia debole può consentire a un utente malintenzionato di prevedere quale valore sensibile alla sicurezza verrà generato.
CA5395: Attributo HttpVerb mancante per i metodi di azione Tutti i metodi di azione che creano, modificano, eliminano o modificano i dati devono essere protetti con l'attributo antiforgery dagli attacchi di richiesta intersito falsi. L'esecuzione di un'operazione GET deve essere un'operazione sicura che non ha effetti collaterali e non modifica i dati persistenti.
CA5396: Impostare HttpOnly su true per HttpCookie Come misura avanzata di difesa, assicurarsi che i cookie HTTP sensibili alla sicurezza siano contrassegnati come HttpOnly. Ciò indica che i Web browser non devono consentire agli script di accedere ai cookie. Gli script dannosi inseriti sono un modo comune per rubare i cookie.
CA5397: Non usare valori SslProtocols deprecati Transport Layer Security (TLS) protegge la comunicazione tra computer, in genere con PROTOCOLLO HTTPS (Hypertext Transfer Protocol Secure). Le versioni precedenti del protocollo TLS sono meno sicure di TLS 1.2 e TLS 1.3 e hanno maggiori probabilità di avere nuove vulnerabilità. Evitare versioni precedenti del protocollo per ridurre al minimo i rischi.
CA5398: evitare valori SslProtocols hardcoded Transport Layer Security (TLS) protegge la comunicazione tra computer, in genere con PROTOCOLLO HTTPS (Hypertext Transfer Protocol Secure). Le versioni del protocollo TLS 1.0 e TLS 1.1 sono deprecate, mentre TLS 1.2 e TLS 1.3 sono correnti. In futuro, TLS 1.2 e TLS 1.3 potrebbero essere deprecati. Per garantire che l'applicazione rimanga sicura, evitare di impostare come hardcoding una versione del protocollo.
CA5399: Disabilitare sicuramente il controllo dell'elenco di revoche di certificati HttpClient Un certificato revocato non è più attendibile. Può essere usato dagli utenti malintenzionati che passano alcuni dati dannosi o rubano dati sensibili nella comunicazione HTTPS.
CA5400: Verificare che il controllo dell'elenco di revoche di certificati HttpClient non sia disabilitato Un certificato revocato non è più attendibile. Può essere usato dagli utenti malintenzionati che passano alcuni dati dannosi o rubano dati sensibili nella comunicazione HTTPS.
CA5401: Non usare CreateEncryptor con iv non predefinito La crittografia simmetrica deve usare sempre un vettore di inizializzazione non ripetibile per impedire attacchi a dizionario.
CA5402: Usare CreateEncryptor con l'iv predefinito La crittografia simmetrica deve usare sempre un vettore di inizializzazione non ripetibile per impedire attacchi a dizionario.
CA5403: Non impostare un certificato hardcoded Il data parametro o rawData di un X509Certificate costruttore o X509Certificate2 è hardcoded.
CA5404: Non disabilitare i controlli di convalida dei token TokenValidationParameters Le proprietà che controllano la convalida del token non devono essere impostate su false.
CA5405: Non ignorare sempre la convalida dei token nei delegati Il callback assegnato a AudienceValidator o LifetimeValidator restituisce truesempre .
IL3000: evitare di accedere al percorso del file assembly durante la pubblicazione come singolo file Evitare di accedere al percorso del file assembly durante la pubblicazione come singolo file.
IL3001: evitare di accedere al percorso del file assembly durante la pubblicazione come file singolo Evitare di accedere al percorso del file assembly durante la pubblicazione come singolo file.
IL3002: evitare di chiamare i membri annotati con 'RequiresAssemblyFilesAttribute' durante la pubblicazione come singolo file Evitare di chiamare i membri annotati con 'RequiresAssemblyFilesAttribute' quando si esegue la pubblicazione come file singolo
IL3003: le annotazioni 'RequiresAssemblyFilesAttribute' devono corrispondere a tutte le implementazioni o le sostituzioni dell'interfaccia. Le annotazioni 'RequiresAssemblyFilesAttribute' devono corrispondere a tutte le implementazioni o le sostituzioni dell'interfaccia.

Legenda

Nella tabella seguente viene illustrato il tipo di informazioni fornite per ogni regola nella documentazione di riferimento.

Articolo Descrizione
Tipo TypeName per la regola.
ID regola Identificatore univoco per la regola. RuleId e Category vengono usati per l'eliminazione all'origine di un avviso.
Categoria Categoria della regola, ad esempio sicurezza.
La correzione causa un'interruzione o meno Indica se la correzione di una violazione della regola è una modifica importante. Per modifica importante si intende che un assembly che presenta una dipendenza dalla destinazione che ha causato la violazione non verrà ricompilato con la nuova versione corretta o potrebbe non riuscire in fase di esecuzione a causa della modifica. Quando sono disponibili più correzioni e almeno una correzione è una modifica che causa un'interruzione e una correzione non è, vengono specificate sia 'Breaking' che 'Non-breaking'.
Causa Codice gestito specifico che ha fatto sì che la regola generasse un avviso.
Descrizione Descrive i problemi alla base dell'avviso.
Come correggere le violazioni Spiega come modificare il codice sorgente per soddisfare la regola e impedire la generazione di un avviso.
Quando eliminare gli avvisi Descrive quando è possibile eliminare un avviso da questa regola.
Codice di esempio Esempi che violano la regola ed esempi corretti che soddisfano la regola.
Regole correlate Regole correlate.