Ensemble de règles des règles recommandées mixtes
Les règles recommandées du mixed de Microsoft sont focalisées sur les problèmes les plus fréquents et critiques rencontrés dans vos projets C++ qui prennent en charge le Common Language Runtime, comme les failles de sécurité éventuelles, les arrêts brutaux des applications et autres erreurs de logique ou de conception importantes.Vous devez inclure cet ensemble de règles dans tout ensemble de règles personnalisé que vous créez pour vos projets C++ qui prennent en charge le Commun Language Runtime.Cet ensemble de règles est conçu pour être configuré avec l'édition Visual Studio Professional et ultérieure.
Règle |
Description |
---|---|
Utilisation de d'une mémoire non initialisée |
|
Suppression de la référence du pointeur NULL |
|
Utilisation d'une valeur non vérifiée |
|
Valeur de retour ignorée |
|
Terminaison par zéro de l'appel |
|
Terminaison par zéro manquant |
|
Mauvaise Concaténation |
|
Argument String manquant pour formater la fonction |
|
Argument Integer manquant pour formater la fonction |
|
Argument Pointer manquant pour formater la fonction |
|
Argument String Pointer manquant pour formater la fonction |
|
Renvoi de la mémoire non initialisée |
|
L'index dépasse la taille maximale autorisée par la mémoire tampon |
|
L'index dépasse la taille maximale autorisée par la mémoire tampon allouée par la pile |
|
Cast non valide de HRESULT en BOOL |
|
Cast non valide de BOOL en HRESULT |
|
Transtypage inséré par le compilateur de BOOL vers HRESULT non valide |
|
Test HRESULT non valide avec NOT |
|
HRESULT comparé à -1 non valide |
|
Affectation de HRESULT à -1 non valide |
|
Utilisation non valide de HRESULT comme booléen |
|
Constante non nulle avec OR logique |
|
OR logique avec constante non nulle |
|
Un zéro avec un AND logique perd ses effets secondaires |
|
Déroulement local provoqué |
|
Création d'un DACL Null |
|
Descripteurs d'adresses non commercialisés |
|
Utilisation non protégée d'alloca |
|
Utilisation de Terminate Thread |
|
Code mort dans le commutateur limité OR au niveau du bit |
|
Utilisation de l'arithmétique d'octets |
|
Utilisation excessive de la pile |
|
Utilisation d'alloca dans une boucle |
|
Parenthèses manquantes dans le transtypage |
|
Déréférencement du pointeur ignoré |
|
Argument float manquant pour le formatage de la fonction |
|
Argument supplémentaire pour le formatage de la fonction |
|
Argument non float pour le formatage de la fonction |
|
Argument non entier pour le formatage de la fonction |
|
Argument autre qu'un caractère pour le formatage de la fonction |
|
Transtypage de chaîne non valide |
|
Appel CreateProcess non valide |
|
Incompatibilité entre tableau new et scalaire delete |
|
Incompatibilité entre tableau new et tableau delete |
|
Incompatibilité entre allocation et désallocation de mémoire |
|
Priorité de relation de bits |
|
L'affectation remplace le test |
|
Incompatibilité primitive entre tableau new et scalaire delete |
|
Argument objet manquant pour le formatage de la fonction |
|
OR logique de constantes |
|
Perte des effets secondaires de l'OR logique non nul |
|
Test redondant |
|
L'inclusion mutuelle sur l'AND logique est false |
|
L'exclusion mutuelle sur l'OR logique est true |
|
Priorité NOT logique et AND au niveau du bit |
|
Priorité NOT logique et OR au niveau du bit |
|
La boucle calcule à partir de la valeur maximale |
|
La boucle calcule à partir de la valeur minimale |
|
Le corps de la boucle n'est jamais exécuté |
|
Boucle infinie |
|
Boucle exécutée une seule fois |
|
Résultat du transtypage décalé en une taille supérieure |
|
Comparaison champ de bits et booléen |
|
Argument de chaîne de caractères non valide pour formater la fonction |
|
Argument de chaîne de caractères larges invalide pour formater la fonction |
|
Incompatibilité entre la taille et la quantité |
|
Appel de fonction d'argument de variable non valide |
|
Fuite de réallocation |
|
Constante de filtre d'exception non autorisée |
|
Boucle d'Exception continue Exception |
|
Priorité d'OR au niveau du bit |
|
Complément NOT NOT |
|
Exception de Recherche continue |
|
Ignoré par la virgule |
|
Copie d'une chaîne au lieu d'une comparaison de chaînes |
|
Incompatibilité de type d'argument possible |
|
Indicateurs VirtualFree non valides |
|
Paramètre VirtualFree non valide |
|
Taille VirtualFree non valide |
|
Fuite du handle de processus |
|
Informations sur l'arrêt manquantes |
|
Dépassement de mémoire tampon en raison de la conversion de element-count en byte-count |
|
Division de taille du pointeur |
|
Dépassement en lecture |
|
Dépassement en écriture |
|
Valeur du paramètre non valide |
|
Valeur du paramètre non valide |
|
Propriété d'attribut non-valide |
|
Valeurs de propriété d'attribut en conflit |
|
Les références ne peut pas avoir la valeur null |
|
Null sur élément non pointeur |
|
MustCheck sur Void |
|
Taille de mémoire tampon sur élément non pointeur ou tableau |
|
Incompatibilité de Null de déférencement de zéro |
|
Accès en écriture sur constante |
|
Retour utilisé sur condition préalable |
|
Terminaison par Null sur élément non pointeur |
|
MustCheck doit avoir la valeur Yes ou No |
|
Taille d'élément sans taille de mémoire tampon |
|
Taille de mémoire tampon dépasse la taille du tableau |
|
Taille de mémoire tampon sur élément non pointeur |
|
Pas de propriétés sur l'attribut |
|
Taille valide dans mémoire tampon non lisible |
|
Taille accessible en écriture dans mémoire tampon non accessible en écriture |
|
Annotation non valide : la valeur de la propriété 'NeedsRelease' doit être définie à Yes ou No |
|
Déférencement de String Size non valide |
|
Type de String Size Invalid |
|
Paramètre de taille de chaîne non valide |
|
Chaîne de taille non valide. Emplacement inaccessible. |
|
Taille du type de tampon de chaîne invalide |
|
Annotation non valide : la propriété 'NeedsRelease' peut ne pas être utilisée dans des valeurs de type void |
|
Style de chaîne de format non reconnu |
|
L'utilisation d'annotations d'attribut sur cette fonction invalidera l'ensemble de ses annotations __declspec existantes |
|
Spécification de taille non valide : l'expression n'est pas analysable |
|
Deref= ou Notref= non valide : l'expression n'est pas analysable |
|
La valeur n'est pas une valeur Yes/No/Maybe valide |
|
La valeur n'est pas une valeur de chaîne |
|
La valeur n'est pas un nombre |
|
Erreur d'expression de l'annotation inattendue |
|
Le nombre d'arguments attendus pour l'annotation ne correspond pas au nombre réel d'arguments pour l'annotation |
|
Erreur d'Annotation pour l'annotation inattendue |
|
Échec de l'enregistrement du fichier journal XML |
|
Condition de concurrence |
|
Impossible d'utiliser correctement l'opération à blocage |
|
Appelant ne parvenant pas à maintenir le verrou |
|
Appelant ne parvenant pas à libérer le verrou |
|
L'appelant ne peut maintenir aucun verrou |
|
Échec de la libération du verrou |
|
Échec de la libération du verrou |
|
Libération d'un verrou non maintenu |
|
Erreur d'annotation SAL d'accès concurrentiel |
|
L'expression n'a pas la valeur true dans cet appel |
|
Le paramètre annoté doit être un pointeur |
|
La ou les classes de fonction sur cette fonction ne correspondent pas à la ou les classes de fonction sur le typedef utilisé pour la définir. |
|
La fonction attribuée ou passée doit avoir une annotation _Function_class_ pour au moins une classe |
|
Le pointeur de la fonction attribuée est annoté avec la classe de fonction laquelle n'est pas contenue dans la ou les listes de classes de fonction. |
|
Le type du paramètre réel doit correspondre exactement au type |
|
Une variable à laquelle vous accédez via une fonction Interlocked doit toujours être accédée via cette fonction. |
|
Accès à une variable locale via une fonction Interlocked |
|
La fonction doit être appelée depuis l'intérieur d'un bloc try/except |
|
L'argument de la variable devrait plutôt être une constante (littéral) |
|
L'argument de la constante devrait plutôt être une variable |
|
Utilisez une autre fonction. |
|
Error annotation |
|
La fonction ne doit jamais être appelée depuis l'intérieur d'un bloc try/except |
|
L'argument est passé à une fonction qui attends un pointeur vers un objet (pas un pointeur vers un pointeur) |
|
Déréférencer le pointeur NULL.Le pointeur contient la même valeur NULL que contenait un autre pointeur. |
|
L'argument pouvait être une valeur et il est une copie de la valeur trouvée dans le pointeur |
|
La variable contient une valeur qui doit être examinée |
|
La spécification n'est pas satisfaite. (L'expression n'a pas la valeur true.) |
|
Référence non autorisée au membre non statique |
|
Référence ambiguë au membre de classe. |
|
_Success_ ou _On_failure_ utilisés dans un contexte non autorisé |
|
L'opérande de gauche pointe vers un struct, utiliser '->' |
|
L'opérande de gauche est un struct, utiliser '.' |
|
La déclaration pour un symbole possède une déclaration en conflit |
|
Les annotations pour le contexte __on_failure ne doivent pas se trouver dans un contexte préalable explicite |
|
Nom du contexte statique attendu pour SAL_context |
|
Expression de pointeur attendue pour l'annotation |
|
L'annotation _Use_decl_annotations_ doit être utilisée pour référencer, sans modification, une déclaration antérieure. |
|
Les noms des paramètres d'attribut doivent être p1…p9 |
|
Le typefix ne peut pas être appliqué à un paramètre qui contient déjà un typefix |
|
L'annotation checkReturn s'applique uniquement aux postconditions pour le paramètre fonction spécifique. |
|
Pour la fonction, le nombre de paramètres de l'annotation ne correspond pas au nombre trouvé dans le fichier |
|
Pour le paramètre de la fonction, le paramètre de l'annotation ne correspond pas au nombre trouvé sur le fichier |
|
Membre de l'énumération attendu pour une annotation, le paramètre dans l'annotation |
|
Expression d'entier attendue pour annotation du paramètre dans l'annotation |
|
Expression de chaîne attendue pour le paramètre dans l'annotation |
|
__yes, __no, ou __maybe attendu pour l'annotation |
|
Jeton/identificateur attendu pour le paramètre de l'annotation |
|
L'annotation requiert des paramètres |
|
N'a pas trouvé le nombre correcte de paramètres requis dans l'annotation |
|
L'annotation ne peut pas être un PrimOp également (dans la déclaration actuelle) |
|
L'annotation ne peut pas être un PrimOp également (voir la déclaration antérieure) |
|
Annotation paramètre : le type ne peut pas être utilisé dans les annotations |
|
L'annotation ne prend pas en charge des paramètres |
|
Le type de paramètre n'a aucun membre. |
|
L'annotation n'est valide que sur un tableau |
|
pre, post, ou deref ne sont appliqués à aucune annotation |
|
pre, post, ou deref sont appliqués à un bloc |
|
L'expression __at ne s'applique pas à la fonction active |
|
La fonction ne peut pas être une annotation autonome |
|
L'annotation ne peut pas être utilisée dans une expression |
|
L'annotation sur paramètre n'est plus prise en charge |
|
L'annotation sur paramètre possède plusieurs valeurs, stringValue, et longValue.Utilisez paramn=xxx |
|
L'annotation sur paramètre possède à la fois value, stringValue, ou longValue ; et paramn=xxx.Utiliser uniquement paramn=xxx |
|
L'annotation sur paramètre possède param2 et non param1 |
|
L'Annotation pour la fonction sur paramètre n'est pas reconnu |
|
L'annotation pour la fonction sur paramètre nécessite plus de déréférencements que ne l'autorise le type réel annoté |
|
L'annotation pour la fonction possède un paramètre/annotation externe non analysable |
|
L'annotation pour la fonction annote 'this' sur une fonction non membre |
|
Le paramètre d'annotation pour la fonction ne correspond pas au type du paramètre |
|
Annotation incohérente pour la function : l'instance précédente présente une erreur. |
|
Annotation incohérente pour la fonction : Cette instance a une erreur. |
|
Annotation incohérente pour la fonction : paramètre a une annotation sur cet instance. |
|
Annotation incohérente pour la fonction : paramètre a une annotation sur cet instance. |
|
dynamic_cast<>() n'est pas pris en charge dans les annotations |
|
Une erreur de syntaxe dans l'annotation a été trouvée dans la fonction pour l'annotation |
|
Une erreur de syntaxe dans une annotation conditionnelle a été trouvée pour l'annotation intrinsèque |
|
Les valeurs des listes de résultats doivent être des constantes. |
|
Une erreur de syntaxe dans les annotations a été trouvée dans la fonction d'annotation. |
|
L'annotation pour la fonction, paramètre lors de l'examen est incohérente avec la déclaration de la fonction |
|
Pour la fonction, les indices sont incohérentes avec la déclaration de la fonction |
|
Le paramètre de _Macro_value_ a la valeur null |
|
Pour le symbole, un 'begin' a été trouvé sans 'end' correspondant |
|
Pour le symbole, un 'end' a été trouvé sans 'begin' correspondant |
|
Les chaînes de format doivent se trouver dans les conditions préalables |
|
Pour la fonction, une erreur de syntaxe dans le paramètre |
|
Pour la fonction, une erreur de syntax vers la fin |
|
Pour la fonction erreur dans l'annotation _At_() (nom de paramètre non reconnu) |
|
Pour la fonction, erreur dans l'annotation _At_() (nom de paramètre non valide) |
|
Pour la fonction : ReadableTo ou WritableTo n'a pas eu de spécification de limites en tant que paramètre |
|
L'annotation pour la fonction contient plus d'Externals que le nombre réel de paramètres |
|
post null/notnull au niveau 0 deref n'a pas de sens pour la fonction. |
|
Opérandes d'expression de types incompatibles pour l'opérateur |
|
Aucune annotation pour la première déclaration de la fonction. |
|
Un opérateur supplémentaire _Deref_ a été trouvé sur l'annotation. |
|
Un opérateur ambigu _Deref_ a été trouvé sur l'annotation. |
|
Un opérateur _Notref_ placé de manière incorrecte a été trouvé appliqué au token. |
|
Une erreur a été découverte lors de l'analyse du token. |
|
L'annotation sur le paramètre est obsolète |
|
L'annotation sur le paramètre est obsolète |
|
L'annotation décrit une situation qui n'est pas applicable de manière conditionnelle. |
|
L'annotation décrit lorsqu'une valeur dynamique (une variable) ne peut pas être utilisée dans la condition. |
|
Les types qui possèdent des champs supprimables doivent être supprimables |
|
Déclarer les gestionnaires d'événements correctement |
|
Marquer les assemblys avec AssemblyVersionAttribute |
|
Les méthodes d'interface doivent pouvoir être appelées par les types enfants |
|
Les types qui possèdent des ressources natives doivent être supprimables |
|
Déplacer les P/Invoke vers une classe NativeMethods |
|
Ne pas masquer les méthodes de la classe de base |
|
Implémenter IDisposable correctement |
|
Ne pas lever d'exceptions dans des emplacements inattendus |
|
Éviter les accélérateurs en double |
|
Des points d'entrée P/Invoke doivent exister |
|
Les P/Invoke ne doivent pas être visibles |
|
Les types Structurer automatiquement ne doivent pas être visibles par COM |
|
Appeler GetLastError immédiatement après P/Invoke |
|
Les types de base type visibles par COM doivent être visibles par COM |
|
Les méthodes d'inscription COM doivent être mises en correspondance |
|
Déclarer correctement les méthodes P/Invoke |
|
Supprimer les finaliseurs vides |
|
Les champs de type valeur doivent être portables |
|
Les déclarations P/Invoke doivent être portables |
|
Ne définissez pas un verrou sur des objets à identité faible |
|
Rechercher des failles de sécurité dans des requêtes SQL |
|
Spécifiez le marshaling pour les arguments de chaîne P/Invoke |
|
Vérifiez la sécurité déclarative dans les types valeur |
|
Les pointeurs ne doivent pas être visibles |
|
Les types sécurisés ne doivent pas exposer de champs |
|
La sécurité de la méthode doit être un surensemble du type |
|
Les méthodes APTCA doivent uniquement appeler des méthodes APTCA |
|
Les types APTCA doivent uniquement étendre des types de base APTCA |
|
N'exposez pas indirectement des méthodes avec des demandes de liaison |
|
Les demandes de liaison de substitution doivent être identiques au composant de base |
|
Incluez dans un wrapper les clauses finally vulnérables dans un bloc try externe |
|
Les demandes de liaison de types nécessitent des demandes d'héritage |
|
Les types critiques de sécurité ne peuvent pas participer à l'équivalence des types |
|
Les constructeurs par défaut doivent être au moins aussi critiques que les constructeurs par défaut de type de base |
|
Les délégués doivent lier les méthodes avec une transparence cohérente |
|
La transparence des méthodes doit rester cohérente lors de la substitution de méthodes de base |
|
Les méthodes transparentes doivent contenir uniquement des IL vérifiables |
|
Les méthodes transparentes ne doivent pas appeler les méthodes ayant l'attribut SuppressUnmanagedCodeSecurity |
|
Le code transparent ne doit pas faire référence à des éléments critiques de sécurité |
|
Les méthodes transparentes ne répondent pas aux LinkDemands |
|
Les types doivent être au moins aussi critiques que les types de base et les interfaces |
|
Les méthodes transparentes ne peuvent pas utiliser d'assertions de sécurité |
|
Les méthodes transparentes ne doivent pas appeler du code natif |
|
Levez à nouveau une exception pour conserver les détails de la pile |
|
Ne pas supprimer des objets plusieurs fois |
|
Initialisez les champs statiques des types valeur en ligne |
|
Ne marquez pas les composants pris en charge avec WebMethod |
|
Les champs pouvant être supprimés doivent l'être |
|
N'appelez pas de méthodes substituables dans les constructeurs |
|
Les types pouvant être supprimés doivent déclarer un finaliseur |
|
Les finaliseurs doivent appeler le finaliseur de leur classe de base |
|
Implémentez des constructeurs de sérialisation |
|
Surchargez l'opérateur égal (equals) en remplaçant ValueType.Equals |
|
Marquez les points d'entrée Windows Forms avec STAThread |
|
Marquez tous les champs non sérialisés |
|
Appelez les méthodes de la classe de base sur les types ISerializable |
|
Marquer les types ISerializable avec SerializableAttribute |
|
Implémentez les méthodes de sérialisation comme il se doit |
|
Implémentez ISerializable comme il se doit |
|
Fournissez des arguments corrects aux méthodes de mise en forme |
|
Effectuez correctement des tests NaN |