Set di regole estese di correttezza per codice gestito
Il set di regole estese di correttezza Microsoft aumenta il numero di errori di utilizzo del framework e di logica segnalati dall'analisi del codice.Viene posta particolare attenzione su scenari specifici, ad esempio l'interoperabilità COM e le applicazioni mobili.Considerare la possibilità di includere questo set di regole se uno di questi scenari è applicabile al proprio progetto o per rilevare problemi aggiuntivi nel progetto.
Il set di regole estese di correttezza Microsoft include le regole contenute nel set di regole di correttezza di base Microsoft.Il set di regole di base di correttezza Microsoft include le regole contenute nel set di regole minime consigliate Microsoft.Per ulteriori informazioni, vedere Set di regole base di correttezza per codice gestito e Set di regole consigliate gestite per codice gestito
Nella tabella seguente vengono descritte tutte le regole del set di regole estese di correttezza Microsoft.
Regola |
Descrizione |
---|---|
I tipi proprietari di campi Disposable devono essere Disposable |
|
Dichiarare correttamente i gestori eventi |
|
Contrassegnare gli assembly con AssemblyVersionAttribute |
|
I metodi di interfaccia devono essere richiamabili dai tipi figlio |
|
I tipi delle risorse native devono essere Disposable |
|
Spostare i P/Invoke nella classe NativeMethods |
|
Non nascondere i metodi di una classe base |
|
Implementare IDisposable correttamente |
|
Non generare eccezioni in posizioni non previste |
|
Evitare tasti di scelta rapida duplicati |
|
I punti di ingresso P/Invoke devono esistere |
|
I P/Invoke non devono essere visibili |
|
I tipi layout automatici non devono essere visibili a COM |
|
Chiamare GetLastError immediatamente dopo P/Invoke |
|
I tipi di base del tipo visibile a COM devono essere visibili a COM |
|
I metodi di registrazione COM devono corrispondere |
|
Dichiarare correttamente i P/Invoke |
|
Rimuovere i finalizzatori vuoti |
|
I campi dei tipi di valore devono essere portabili |
|
Le dichiarazioni P/Invoke devono essere portabili |
|
Non bloccare oggetti con identità debole |
|
Controllare l'eventuale vulnerabilità di sicurezza delle query SQL |
|
Specificare il marshalling per gli argomenti di stringa P/Invoke |
|
Controllare la sicurezza dichiarativa sui tipi di valori |
|
I puntatori non devono essere visibili |
|
I tipi protetti non devono esporre campi |
|
La sicurezza del metodo deve essere un superset del tipo |
|
I metodi APTCA devono chiamare solo metodi APTCA |
|
I tipi APTCA devono estendere solo tipi di base APTCA |
|
Non esporre in modo indiretto metodi con richieste di collegamento |
|
Le richieste di collegamento negli override devono essere identiche a quelle nei metodi di base |
|
Eseguire il wrapping delle clausole finally vulnerabili in un try esterno |
|
Per le richieste di collegamento dei tipi sono necessarie richieste di ereditarietà |
|
I tipi SecurityCritical non possono partecipare all'equivalenza del tipo |
|
I costruttori predefiniti devono essere Critical almeno come i costruttori predefiniti del tipo base |
|
Delegati devono essere associati ai metodi con trasparenza consistente |
|
I metodi devono conservare trasparenza consistente durante l'override dei metodi base |
|
I metodi Transparent devono contenere solo IL verificabile |
|
I metodi Transparent non devono chiamare i metodi con l'attributo SuppressUnmanagedCodeSecurity |
|
Il codice Transparent non deve far riferimento a elementi SecurityCritical |
|
I metodi Transparent non devono soddisfare i LinkDemand |
|
I tipi devono essere Critical almeno come le interfacce e i tipi base relativi |
|
I metodi Transparent non possono utilizzare asserzioni di sicurezza |
|
I metodi Transparent non devono effettuare chiamate nel codice nativo |
|
Eseguire il rethrow per conservare i dettagli dello stack |
|
Non eliminare oggetti più volte |
|
Inizializzare i campi statici dei tipi di valore inline |
|
Non contrassegnare componenti serviti con WebMethod |
|
I campi Disposable devono essere eliminati |
|
Non chiamare metodi sottoponibili a override nei costruttori |
|
I tipi Disposable devono dichiarare un finalizzatore |
|
I finalizzatori devono chiamare il finalizzatore della classe base |
|
Implementare costruttori di serializzazione |
|
Eseguire l'overload dell'operatore "uguale a" all'override di ValueType.Equals |
|
Contrassegnare i punti di ingresso del Windows Form con STAThread |
|
Contrassegnare tutti i campi non serializzabili |
|
Chiamare metodi della classe base su tipi ISerializable |
|
Contrassegnare i tipi ISerializable con SerializableAttribute |
|
Implementare correttamente i metodi di serializzazione |
|
Implementare ISerializable in modo corretto |
|
Fornire argomenti corretti ai metodi di formattazione |
|
Testare i valori NaN in modo corretto |
|
Gli enum devono avere valore zero |
|
Eseguire l'overload dell'operatore "uguale a" all'overload degli operatori di addizione e sottrazione |
|
Non passare valori letterali come parametri localizzati |
|
Normalizzare le stringhe in lettere maiuscole |
|
Non ignorare i risultati dei metodi |
|
Chiamare GC.SuppressFinalize correttamente |
|
Le proprietà non devono restituire matrici |
|
Testare le stringhe vuote utilizzando la lunghezza di stringa |
|
Utilizzare solo API della versione di .NET Framework di destinazione |
|
Rimuovere le chiamate a GC.KeepAlive |
|
Utilizzare SafeHandle per incapsulare le risorse native |
|
Individuare le eccezioni non CLSCompliant nei gestori generali |
|
Non dichiarare tipi di riferimento modificabili in sola lettura |
|
I campi di matrici non devono essere in sola lettura |
|
Asserzioni protette |
|
Chiamare GC.KeepAlive durante l'utilizzo di risorse native |
|
Impostare come sealed i metodi che soddisfano interfacce private |
|
Proteggere i costruttori di serializzazione |
|
I costruttori statici devono essere privati |
|
Le costanti SecurityCritical devono essere Transparent |
|
Utilizzare equivalenti gestiti dell'API Win32 |
|
I metodi Dispose devono chiamare il metodo Dispose della classe base |
|
I finalizzatori devono essere protetti |
|
Non diminuire la visibilità di membri ereditati |
|
La differenza tra membri non deve limitarsi al tipo restituito |
|
Eseguire l'override di Equals all'override dell'operatore |
|
Gli operatori devono avere overload simmetrici |
|
Le proprietà di raccolta devono essere in sola lettura |
|
Fornire metodi di deserializzazione per i campi facoltativi |
|
Implementare costruttori di eccezioni standard |
|
I parametri URI non devono essere stringhe |
|
I valori restituiti URI non devono essere stringhe |
|
Le proprietà URI non devono essere stringhe |
|
Gli overload URI di stringhe chiamano gli overload System.Uri |
|
Evitare gli overload nelle interfacce visibili a COM |
|
Evitare gli argomenti Int64 per i client Visual Basic 6 |
|
Evitare i membri statici nei tipi visibili a COM |
|
Non utilizzare AutoDual ClassInterfaceType |
|
I tipi visibili a COM devono essere creabili |
|
I metodi di registrazione COM non devono essere visibili |
|
Contrassegnare le interfacce ComSource come IDispatch |
|
Evitare i campi non pubblici nei tipi valore visibili a COM |
|
Contrassegnare gli argomenti P/Invoke booleani con MarshalAs |
|
Non impostare la priorità del processo su Inattivo |
|
Non utilizzare i timer che impediscono le modifiche allo stato di potenza |
|
Contrassegnare gli assembly con NeutralResourcesLanguageAttribute |
|
Evitare le chiamate a metodi problematici |
|
Non considerare i fiber come i thread |
|
Gli assembly di livello 2 non devono contenere LinkDemands |
|
I membri non devono avere annotazioni di trasparenza in conflitto |
|
I metodi Transparent non possono utilizzare l'attributo HandleProcessCorruptingExceptions |
|
Il codice Transparent non deve essere protetto con LinkDemand |
|
I metodi Transparent non devono utilizzare SecurityDemand |
|
Il codice Transparent non deve caricare assembly da matrici di byte |
|
I metodi Transparent non devono includere SuppressUnmanagedCodeSecurityAttribute |
|
I valori letterali devono essere digitati in modo corretto |
|
I campi non costanti non devono essere visibili |
|
Non contrassegnare le enumerazioni con FlagsAttribute |
|
Eseguire l'override di GetHashCode all'override di Equals |
|
Non generare eccezioni in clausole di eccezione |
|
Gli overload degli operatori hanno alternative con nome |
|
Non fornire formati di risorse non rilasciati |
|
Utilizzare params per argomenti variabili |
|
Evitare l'overflow delle operazioni |
|
Passare oggetti System.Uri invece di stringhe |
|
Valori letterali stringa di attributo devono essere analizzate correttamente |