Partager via


Ensemble de règles d'analyse du code Règles Microsoft minimales recommandées

Vous pouvez utiliser l'ensemble de Règles Microsoft minimales recommandées pour concentrer vos efforts sur les problèmes les plus critiques dans votre code, notamment les failles de sécurité potentielles, les arrêts brutaux d'application et autres erreurs de logique et de conception. Vous devez inclure cet ensemble de règles dans tout ensemble de règles personnalisées que vous créez pour vos projets.

Règle

Description

CA1001 : Les types qui possèdent des champs supprimables doivent être supprimables

Une classe déclare et implémente un champ d'instance qui est un type System.IDisposable, et elle n'implémente pas IDisposable. Une classe qui déclare un champ IDisposable possède indirectement une ressource non managée et doit implémenter l'interface IDisposable.

CA1009 : Déclarer les gestionnaires d'événements correctement

Les méthodes du gestionnaire d'événements acceptent deux paramètres. Le premier est de type System.Object et se nomme "sender". Il s'agit de l'objet qui déclenche l'événement. Le deuxième paramètre est de type System.EventArgs et se nomme "e". Il s'agit des données associées à l'événement. Les méthodes du gestionnaire d'événements ne doivent pas retourner de valeur ; dans le langage de programmation C#, ceci est indiqué par le type de retour void.

CA1016 : Marquer les assemblys avec AssemblyVersionAttribute

Le .NET Framework utilise le numéro de version pour identifier un assembly de manière unique et se lier aux types dans les assemblys avec nom fort. Le numéro de version est utilisé conjointement avec la version et la stratégie d'éditeur. Par défaut, les applications s'exécutent uniquement avec la version d'assembly avec laquelle elles ont été construites.

CA1033 : Les méthodes d'interface doivent pouvoir être appelées par les types enfants

Un type non-sealed (non scellé) visible de l'extérieur fournit une implémentation de méthode explicite d'une interface publique mais ne fournit aucune méthode de substitution visible de l'extérieur de même nom.

CA1049 : Les types qui possèdent des ressources natives doivent être supprimables

Les types qui allouent des ressources non managées doivent implémenter IDisposable pour permettre aux appelants de libérer ces ressources à la demande et de raccourcir les durées de vie des objets qui les détiennent.

CA1060 : Déplacer les P/Invoke vers une classe NativeMethods

Les méthodes d'appel de code non managé, telles que celles qui sont marquées avec l'attribut System.Runtime.InteropServices.DllImportAttribute, ou les méthodes définies à l'aide du mot clé Declare en Visual Basic, accèdent à du code non managé. Ces méthodes doivent être de la classe NativeMethods, SafeNativeMethods ou UnsafeNativeMethods.

CA1061 : Ne pas masquer les méthodes de la classe de base

Une méthode dans un type de base est masquée par une méthode portant le même nom dans un type dérivé, lorsque la signature de paramètre de la méthode dérivée diffère uniquement par les types qui sont dérivés plus faiblement que les types correspondants dans la signature de paramètre de la méthode de base.

CA1063 : Implémenter IDisposable correctement

Tous les types IDisposable doivent implémenter le modèle Dispose correctement.

CA1065 : Ne pas lever d'exceptions dans des emplacements inattendus

Une méthode dont l'objet n'est pas de lever des exceptions lève une exception.

CA1301 : Éviter les accélérateurs en double

Une touche d'accès rapide, également connue sous le nom d'accélérateur, autorise l'accès à un contrôle par le biais du clavier, à l'aide de la touche ALT. Lorsque plusieurs contrôles présentent des touches d'accès rapide en doublon, le comportement de ces dernières n'est pas correctement défini.

CA1400 : Des points d'entrée P/Invoke doivent exister

Une méthode publique ou protégée est marquée avec l'attribut System.Runtime.InteropServices.DllImportAttribute. La bibliothèque non managée n'a pas pu être localisée, ou la méthode n'a pu être mise en correspondance avec aucune fonction de la bibliothèque.

CA1401 : Les P/Invoke ne doivent pas être visibles

Une méthode publique ou protégée dans un type public a l'attribut System.Runtime.InteropServices.DllImportAttribute (également implémenté par le mot clé Declare en Visual Basic). De telles méthodes ne doivent pas être exposées.

CA1403 : Les types Structurer automatiquement ne doivent pas être visibles par COM

Un type valeur visible par COM est marqué avec l'attribut System.Runtime.InteropServices.StructLayoutAttribute qui a la valeur LayoutKind.Auto. La disposition de ces types peut varier suivant les versions du .NET Framework, ce qui bloque les clients COM qui attendent une disposition spécifique.

CA1404 : Appeler GetLastError immédiatement après P/Invoke

La méthode Marshal.GetLastWin32Error ou la fonction Win32 GetLastError équivalente est appelée, et l'appel immédiatement avant ne constitue pas une méthode d'appel de code non managé.

CA1405 : Les types de base type visibles par COM doivent être visibles par COM

Un type visible par COM dérive d'un type qui n'est pas visible par COM.

CA1410 : Les méthodes d'inscription COM doivent être mises en correspondance

Un type déclare une méthode marquée avec l'attribut System.Runtime.InteropServices.ComRegisterFunctionAttribute, mais ne déclare pas une méthode marquée avec l'attribut System.Runtime.InteropServices.ComUnregisterFunctionAttribute, ou vice-versa.

CA1415 : Déclarer correctement les méthodes P/Invoke

Cette règle recherche actuellement des déclarations de méthode d'appel de code non managé qui ciblent des fonctions Win32 présentant un pointeur vers un paramètre de structure OVERLAPPED, et le paramètre managé correspondant n'est pas un pointeur vers une structure System.Threading.NativeOverlapped.

CA1900 : Les champs de type valeur doivent être portables

Cette règle vérifie que les structures déclarées avec une disposition explicite s'aligneront correctement lorsqu'elles seront marshalées pour le code non managé sur les systèmes d'exploitation 64 bits.

CA1901 : Les déclarations P/Invoke doivent être portables

Cette règle évalue la taille de chaque paramètre et la valeur de retour d'un P/Invoke, et vérifie que leur taille est correcte lorsqu'elle est marshalée au code non managé sur les systèmes d'exploitation 32 bits et 64 bits.

CA2000 : Supprimez les objets avant d'être hors de portée

Sachant qu'un événement exceptionnel peut se produire et empêcher l'exécution du finaliseur d'un objet, ce dernier doit plutôt être supprimé explicitement avant que toutes les références à lui soient hors de portée.

CA2002 : Ne définissez pas un verrou sur des objets à identité faible

Un objet est dit d'identité faible lorsqu'il est accessible directement au-delà des limites d'un domaine d'application. Un thread qui essaie d'acquérir un verrou sur un objet qui affiche une identité faible peut être bloqué par un deuxième thread dans un domaine d'application différent qui dispose d'un verrou sur le même objet.

CA2100 : Rechercher des failles de sécurité dans des requêtes SQL

Une méthode définit la propriété System.Data.IDbCommand.CommandText à l'aide d'une chaîne générée à partir d'un argument de chaîne à la méthode. Cette règle suppose que l'argument de chaîne contient des entrées d'utilisateur. Une chaîne de commande SQL construite à partir d'entrées d'utilisateur est vulnérable aux attaques d'injection SQL.

CA2101 : Spécifiez le marshaling pour les arguments de chaîne P/Invoke

Un membre d'appel de code non managé autorise les appelants dotés d'un niveau de confiance partielle, présente un paramètre de chaîne et ne marshale pas explicitement la chaîne. Cela peut provoquer une faille de sécurité potentielle.

CA2108 : Vérifiez la sécurité déclarative dans les types valeur

Un type valeur public ou protégé est sécurisé par l'accès aux données ou des demandes de liaison.

CA2111 : Les pointeurs ne doivent pas être visibles

Un pointeur n'est ni privé, ni interne ni en lecture seule. Un code malveillant peut modifier la valeur du pointeur, autorisant potentiellement l'accès aux emplacements arbitraires en mémoire ou provoquant des défaillances des applications ou du système.

CA2112 : Les types sécurisés ne doivent pas exposer de champs

Un type public ou protégé contient des champs publics et est sécurisé par des demandes de liaison. Si un code a accès à une instance d'un type sécurisé par une demande de liaison, ce code n'a pas besoin de satisfaire la demande de liaison pour accéder aux champs du type.

CA2114 :La sécurité de la méthode doit être un sur-ensemble du type

Pour une même action, une méthode ne doit pas présenter de sécurité déclarative à la fois au niveau méthode et au niveau type.

CA2116 : Les méthodes APTCA doivent uniquement appeler des méthodes APTCA

Lorsque l'attribut APTCA (AllowPartiallyTrustedCallers) est présent sur un assembly doté d'une confiance totale, et lorsque cet assembly exécute un code dans un autre assembly qui n'autorise pas les appelants dotés d'une confiance partielle, il devient possible d'exploiter une faille dans la sécurité.

CA2117 : Les types APTCA doivent uniquement étendre des types de base APTCA

Lorsque l'attribut APTCA (AllowPartiallyTrustedCallers) est présent sur un assembly doté d'une confiance totale et lorsqu'un type présent dans l'assembly hérite d'un type qui n'autorise pas les appelants partiellement approuvés, une exploitation de la sécurité devient possible.

CA2122 : N'exposez pas indirectement des méthodes avec des demandes de liaison

Un membre public ou protégé a des demandes de liaison et est appelé par un membre qui ne procède à aucune vérification de la sécurité. Une demande de liaison vérifie uniquement les autorisations de l'appelant immédiat.

CA2123 : Les demandes de liaison de substitution doivent être identiques au composant de base

Cette règle met en correspondance une méthode et sa méthode de base, qui est soit une interface, soit une méthode virtuelle dans un autre type, puis compare les demandes de liaison sur chacune. Si cette règle est violée, un appelant malveillant peut ignorer la demande de liaison simplement en appelant la méthode non protégée.

CA2124 : Incluez dans un wrapper les clauses finally vulnérables dans un bloc try externe

Une méthode publique ou protégée contient un bloc try/finally. Le bloc finally semble réinitialiser l'état de sécurité et n'est lui-même placé dans aucun bloc finally.

CA2126 : Les demandes de liaison de types nécessitent des demandes d'héritage

Un type unsealed public est protégé par une demande de liaison et a une méthode substituable. Ni le type ni la méthode n'est protégé par une demande d'héritage.

CA2131 : Les types critiques de sécurité ne peuvent pas participer à l'équivalence des types

Un type participe à l'équivalence des types et un type lui-même, ou un membre ou champ du type, est marqué à l'aide de l'attribut SecurityCriticalAttribute. Cette règle se déclenche sur tout type ou type critique contenant des méthodes critiques ou des champs qui participent à l'équivalence de type. Lorsque le CLR détecte un tel type, il ne peut pas le charger avec une exception TypeLoadException au moment de l'exécution. En général, cette règle se déclenche uniquement lorsque les utilisateurs implémentent l'équivalence de type manuellement plutôt qu'en comptant sur tlbimp et les compilateurs pour faire l'équivalence de type.

CA2132 : Les constructeurs par défaut doivent être au moins aussi critiques que les constructeurs par défaut de type de base

Les types et les membres qui possèdent l'attribut SecurityCriticalAttribute ne peuvent pas être utilisés par le code d'application Silverlight. Les types et membres critiques de sécurité peuvent être uniquement utilisés par le .NET Framework dans la bibliothèque de classes Silverlight. Parce qu'une construction publique ou protégée dans une classe dérivée doit avoir la même transparence ou une transparence supérieure à sa classe de base, une classe dans une application ne peut pas être dérivée d'une classe marqué SecurityCritical.

CA2133 : Les délégués doivent lier les méthodes avec une transparence cohérente

Cet avertissement se déclenche sur une méthode qui lie un délégué marqué à l'aide de l'attribut SecurityCriticalAttribute à une méthode transparente ou marquée à l'aide de l'attribut SecuritySafeCriticalAttribute. L'avertissement se déclenche également une méthode qui lie un délégué transparent ou critique sécurisé à une méthode critique.

CA2134 : La transparence des méthodes doit rester cohérente lors de la substitution de méthodes de base

Cette règle se déclenche lorsqu'une méthode marquée à l'aide de l'attribut SecurityCriticalAttribute remplace une méthode qui est transparente ou marquée à l'aide de l'attribut SecuritySafeCriticalAttribute. La règle se déclenche également lorsqu'une méthode qui est transparente ou marquée à l'aide de l'attribut SecuritySafeCriticalAttribute remplace une méthode qui est marquée à l'aide d'un attribut SecurityCriticalAttribute. La règle est appliquée lors de la substitution d'une méthode virtuelle ou de l'implémentation d'une interface.

CA2137 : Les méthodes transparentes doivent contenir uniquement des IL vérifiables

Une méthode contient du code non vérifiable ou retourne un type par référence. Cette règle se déclenche lorsque le code transparent de sécurité tente d'exécuter du code MISL (Microsoft Intermediate Language) non vérifiable. Toutefois, la règle ne contient pas de vérificateur IL complet, et à la place utilise l'heuristique pour intercepter la plupart des violations de vérification MSIL.

CA2138 : Les méthodes transparentes ne doivent pas appeler les méthodes ayant l'attribut SuppressUnmanagedCodeSecurity

Une méthode transparente de sécurité appelle une méthode qui est marquée à l'aide de l'attribut SuppressUnmanagedCodeSecurityAttribute.

CA2141 : Les méthodes transparentes ne répondent pas aux LinkDemands

Une méthode transparente de sécurité appelle une méthode dans un assembly qui n'est pas marqué à l'aide de l'attribut APTCA, ou une méthode transparente de sécurité satisfait une demande LinkDemand pour un type ou une méthode.

CA2146 : Les types doivent être au moins aussi critiques que les types de base et les interfaces

Une méthode transparente de sécurité appelle une méthode dans un assembly qui n'est pas marqué à l'aide de l'attribut APTCA, ou une méthode transparente de sécurité satisfait une demande LinkDemand pour un type ou une méthode.

CA2147 : Les méthodes transparentes ne peuvent pas utiliser d'assertions de sécurité

Aucune autorisation suffisante n'est accordée à un code marqué comme attribut SecurityTransparentAttribute pour procéder à une assertion.

CA2149 : Les méthodes transparentes ne doivent pas appeler du code natif

Cette règle se déclenche sur toute méthode transparente qui appelle directement en code natif (par exemple, via un appel P/Invoke). Les violations de cette règle provoquent une exception MethodAccessException dans le modèle de transparence de niveau 2, et une demande complète pour le code UnmanagedCode dans le modèle de transparence de niveau 1.

CA2200 : Levez à nouveau une exception pour conserver les détails de la pile

Une exception est à nouveau levée et est spécifiée explicitement dans l'instruction throw. Si une exception est à nouveau levée par sa spécification dans l'instruction throw, la liste des appels de méthode présents entre la méthode d'origine qui a levé l'exception et la méthode actuelle est perdue.

CA2202 : Ne pas supprimer des objets plusieurs fois

Une implémentation de méthode contient des chemins d'accès de code qui peuvent provoquer des appels multiples à System.IDisposable.Dispose ou un Dispose équivalent (par exemple, une méthode Close() sur certains types) sur le même objet.

CA2207 : Initialisez les champs statiques des types valeur en ligne

Un type valeur déclare un constructeur statique explicite. Pour corriger une violation de cette règle, initialisez toutes les données statiques lorsqu'elles sont déclarées et supprimez le constructeur statique.

CA2212 : Ne marquez pas les composants pris en charge avec WebMethod

Une méthode dans un type qui hérite de System.EnterpriseServices.ServicedComponent est marquée avec System.Web.Services.WebMethodAttribute. Sachant que WebMethodAttribute et une méthode ServicedComponent ont des comportements incompatibles et des exigences en matière de contexte et de flux de transactions, le comportement de la méthode est incorrect dans certains scénarios.

CA2213 : Les champs pouvant être supprimés doivent l'être

Un type qui implémente System.IDisposable déclare des champs de types qui implémentent également IDisposable. La méthode Dispose du champ n'est pas appelée par la méthode Dispose du type déclarant.

CA2214 : N'appelez pas de méthodes substituables dans les constructeurs

Lorsqu'un constructeur appelle une méthode virtuelle, il est possible que le constructeur de l'instance qui appelle la méthode n'ait pas été exécuté.

CA2216 : Les types pouvant être supprimés doivent déclarer un finaliseur

Un type qui implémente System.IDisposable et présente des champs qui laissent entendre l'utilisation de ressources non managées n'implémente pas de finaliseur conforme à la description de Object.Finalize.

CA2220 : Les finaliseurs doivent appeler le finaliseur de leur classe de base

La finalisation doit être propagée par le biais de la hiérarchie d'héritage. Pour garantir ce procédé, les types doivent appeler leur méthode Finalize de classe de base à partir de leur propre méthode Finalize.

CA2229 : Implémentez des constructeurs de sérialisation

Pour corriger une violation de cette règle, implémentez le constructeur de sérialisation. Dans le cas d'une classe sealed, rendez le constructeur privé ; sinon, attribuez-lui l'état protégé.

CA2232 : Marquez les points d'entrée Windows Forms avec STAThread

STAThreadAttribute indique que le modèle de thread COM pour l'application est un thread cloisonné (STA, Single-Threaded Apartment). Cet attribut doit être présent au point d'entrée de toute application qui utilise des Windows Forms ; s'il est omis, les composants Windows peuvent ne pas fonctionner correctement.

CA2235 : Marquez tous les champs non sérialisés

Un champ d'instance d'un type non sérialisable est déclaré dans un type sérialisable.

CA2236 : Appelez les méthodes de la classe de base sur les types ISerializable

Pour corriger une violation de cette règle, appelez la méthode GetObjectData ou le constructeur de sérialisation du type de base issu du constructeur ou de la méthode du type dérivé correspondant.

CA2237 : Marquer les types ISerializable avec SerializableAttribute

Pour être reconnus par le Common Language Runtime comme sérialisables, les types doivent être marqués avec l'attribut SerializableAttribute même s'ils utilisent une routine de sérialisation personnalisée par le biais de l'implémentation de l'interface ISerializable.

CA2238 : Implémentez les méthodes de sérialisation comme il se doit

Une méthode qui gère un événement de sérialisation n'a pas la signature, le type de retour ou la visibilité appropriée.

CA2240 : Implémentez ISerializable comme il se doit

Pour corriger une violation de cette règle, rendez la méthode GetObjectData visible et substituable, et assurez-vous que tous les champs d'instance sont intégrés au processus de sérialisation ou sont marqués explicitement avec l'attribut NonSerializedAttribute.

CA2241 : Fournissez des arguments corrects aux méthodes de mise en forme

L'argument format passé à System.String.Format ne contient aucun élément de format qui corresponde à chaque argument d'objet, ou vice versa.

CA2242 : Effectuez correctement des tests NaN

Cette expression teste une valeur par rapport à Single.Nan ou Double.Nan. Utilisez Single.IsNan(Single) ou Double.IsNan(Double) pour tester la valeur.