Analyser la qualité du code C++ des applications du Windows Store à l'aide de l'analyse statique du code Visual Studio
L'outil d'analyse du code dans les éditions Visual Studio Express examine votre code à la recherche d'un ensemble d'erreurs courantes et du non-respect d'une bonne approche en matière de programmation. Les avertissements de l'analyse du code diffèrent des erreurs et des avertissements du compilateur, car l'analyse du code recherche des modèles de code spécifiques qui sont valides, mais qui peuvent créer des problèmes pour vous ou d'autres utilisateurs de votre code. L'analyse du code peut également trouver des erreurs dans votre code qui seraient difficiles à détecter en testant. L'exécution de l'outil d'analyse du code à intervalles réguliers pendant le processus de développement peut améliorer la qualité de votre application terminée.
Notes
Dans Visual Studio Ultimate, Visual Studio Premium et Visual Studio Professional, vous pouvez utiliser les fonctionnalités complètes des outils d'analyse du code.Voir Analyse de la qualité des applications à l'aide des outils d'analyse du code dans MSDN Library.
Dans cette rubrique
Vous allez découvrir ce qui suit :
Exécution de l'analyse du code
Analyse et résolution des avertissements de l'analyse du code
Suppression des avertissements de l'analyse du code
Recherche et filtrage des résultats de l'analyse du code
Exécution de l'analyse du code
Pour exécuter l'analyse du code sur votre solution Visual Studio :
- Dans le menu Générer, choisissez Exécuter l'analyse du code sur la solution.
Pour exécuter automatiquement l'analyse du code chaque fois que vous générez un projet :
Dans l'Explorateur de solutions, sélectionnez le nom du projet, puis choisissez Propriétés.
Dans la page des propriétés du projet, choisissez Analyse du code, puis Activer l'analyse du code pour la génération C/C++ sur la build.
La solution est compilée et l'analyse du code s'exécute. Les résultats s'affichent dans la fenêtre Analyse du code.
Analyse et résolution des avertissements de l'analyse du code
Pour analyser un avertissement spécifique, choisissez son titre dans la fenêtre Analyse du code. L'avertissement se développe pour afficher des informations détaillées sur le problème. Quand cela est possible, l'analyse du code affiche le numéro de la ligne et la logique de l'analyse qui a conduit à l'avertissement.
Quand vous développez un avertissement, les lignes de code à l'origine de l'avertissement sont mises en surbrillance dans l'éditeur de code Visual Studio.
Une fois que vous avez compris le problème, vous pouvez le résoudre dans votre code. Réexécutez l'analyse du code pour vérifier que l'avertissement n'apparaît plus dans la fenêtre Analyse du code et que votre correctif n'a pas généré de nouveaux avertissements.
Conseil
Vous pouvez réexécuter l'analyse du code dans la fenêtre Analyse du code.Choisissez le bouton Analyser, puis choisissez la portée de l'analyse.Vous pouvez réexécuter l'analyse sur la solution complète ou sur un projet sélectionné.
Suppression des avertissements de l'analyse du code
Vous pouvez décider, dans certaines situations, de ne pas corriger un avertissement de l'analyse du code. Vous pouvez décider que la résolution de l'avertissement requiert un recodage trop important par rapport à la probabilité que le problème se produise dans une implémentation réelle de votre code. Vous pouvez également estimer que l'analyse utilisée dans l'avertissement est inadéquate pour le contexte particulier. Vous pouvez supprimer des avertissements individuels afin qu'ils n'apparaissent plus dans la fenêtre Analyse du code.
Pour supprimer un avertissement :
Si les informations détaillées ne s'affichent pas, développez le titre de l'avertissement.
Cliquez sur le lien Actions au bas de l'avertissement.
Choisissez de Supprimer le message, puis choisissez Dans la source.
La suppression d'un message insère #pragma(warning:Warningld), qui supprime l'avertissement pour la ligne de code.
Recherche et filtrage des résultats de l'analyse du code
Vous pouvez effectuer une recherche dans de longues listes de messages d'avertissement, et vous pouvez filtrer les avertissements dans les solutions à projets multiples.
Avertissements de l'analyse du code C++
L'analyse du code génère les avertissements suivants pour le code C++ :
Règle |
Description |
---|---|
Utilisation d'une mémoire non initialisée |
|
Déréférencement du pointeur Null |
|
Utilisation d'une valeur non vérifiée |
|
Terminaison par zéro de l'appel |
|
Concaténation non valide |
|
Argument de chaîne manquant pour le formatage de la fonction |
|
Argument d'entier manquant pour le formatage de la fonction |
|
Argument de pointeur manquant pour le formatage de la fonction |
|
Argument de pointeur de chaîne manquant pour le formatage de la fonction |
|
Retour d'une 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 |
|
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 |
|
Argument d'objet non valide pour le formatage de la fonction |
|
Priorité NOT logique et AND au niveau du bit |
|
Priorité NOT logique et OR au niveau du bit |
|
Argument de chaîne de caractères non valide pour le formatage de la fonction |
|
Argument de chaîne de caractères larges non valide pour le formatage de la fonction |
|
Incompatibilité entre la taille et la quantité |
|
Appel de fonction d'argument de variable non valide |
|
Incompatibilité de type d'argument possible |
|
Dépassement en lecture |
|
Dépassement en écriture |
|
Valeur de paramètre non valide |
|
Propriété d'attribut non valide |
|
Valeurs de propriété d'attribut en conflit |
|
Les références ne peuvent pas être 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 au déréférencement nul |
|
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 la mémoire tampon sur élément non pointeur |
|
Attribut sans propriété |
|
Taille valide dans mémoire tampon non lisible |
|
Taille accessible en écriture dans mémoire tampon non accessible en écriture |
|
Annotation non valide : la propriété NeedsRelease doit avoir la valeur Yes ou No |
|
Déréférencement de chaîne de taille non valide |
|
Type de chaîne de taille non valide |
|
Paramètre de chaîne de taille non valide |
|
Chaîne de taille non valide. Emplacement inaccessible |
|
Type de tampon de chaîne de taille non valide |
|
Annotation non valide : la propriété NeedsRelease ne doit pas être utilisée sur des valeurs de type void |
|
Style de chaîne de format non reconnu |
|
L'utilisation des annotations d'attribut sur cette fonction rendra non valides toutes ses annotations __declspec existantes |
|
Spécification de taille non valide : expression impossible à analyser |
|
Deref= ou Noref= non valide : expression impossible à analyser |
|
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 attendu pour l'annotation ne correspond pas au nombre réel d'arguments pour l'annotation |
|
Erreur d'annotation inattendue pour l'annotation |
|
Le paramètre annoté doit être un pointeur |
|
Déréférencement du pointeur NULL. Le pointeur contient la même valeur NULL qu'un autre pointeur. |
|
Référence non autorisée à un membre non statique |
|
Référence ambiguë à un membre de classe. |
|
_Success_ ou _On_failure_ utilisé dans un contexte non autorisé |
|
L'opérande de gauche pointe vers un struct, utiliser '->' |
|
L'opérande de gauche est un struct, utiliser '.' |
|
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 ne s'applique qu'aux post-conditions pour le paramètre de 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 fonction, le paramètre de l'annotation ne correspond pas au paramètre trouvé dans le fichier |
|
Membre de l'énumération attendu pour une annotation, le paramètre dans l'annotation |
|
Expression d'entier attendue pour une annotation, le paramètre dans l'annotation |
|
Expression de chaîne attendue pour le paramètre dans l'annotation |
|
__yes, __no ou __maybe attendus pour l'annotation |
|
Jeton/identificateur introuvable pour l'annotation, paramètre |
|
L'annotation requiert des paramètres |
|
Nombre correct de paramètres requis introuvable dans l'annotation |
|
L'annotation ne peut pas être également un PrimOp (dans la déclaration actuelle) |
|
L'annotation ne peut pas être également un PrimOp (voir la déclaration antérieure) |
|
Paramètre d'annotation : impossible d'utiliser ce type dans les annotations |
|
L'annotation ne prend pas en charge les paramètres |
|
Le type de paramètre ne contient pas de 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 actuelle |
|
La fonction ne peut pas constituer à elle seule une annotation |
|
L'annotation ne peut pas être utilisée dans une expression |
|
L'annotation sur le paramètre n'est plus prise en charge |
|
Plusieurs value, stringValue et longValue sont définies dans l'annotation sur le paramètre. Utiliser paramn=xxx |
|
value, stringValue ou longValue, et paramn=xxx sont définis en même temps dans l'annotation sur le paramètre. Utiliser uniquement paramn=xxx |
|
L'annotation sur le paramètre possède un param2, mais pas de param1 |
|
L'annotation pour la fonction sur le paramètre n'est pas reconnue |
|
L'annotation pour la fonction sur le paramètre nécessite plus de déréférencements que le type réel annoté ne le permet. |
|
L'annotation pour la fonction annote 'this' sur une fonction non membre |
|
L'annotation du paramètre ne correspond pas au type du paramètre |
|
Annotation incohérente pour une fonction : l'instance précédente contient une erreur. |
|
Annotation incohérente pour une fonction : cette instance contient une erreur. |
|
Annotation incohérente pour une fonction : le paramètre contient d'autres annotations sur cette instance. |
|
Annotation incohérente pour une fonction : le paramètre contient d'autres annotations sur cette 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 pour l'annotation dans la fonction. |
|
L'annotation pour la fonction, paramètre pendant la vérification est incohérente avec la déclaration de fonction |
|
Pour la fonction, les indices sont incohérents avec la déclaration de fonction |
|
Le paramètre de _Macro_value_ a la valeur null |
|
Pour le symbole, un 'begin' a été trouvé sans le 'end' correspondant |
|
Pour le symbole, un 'end' a été trouvé sans le 'begin' correspondant |
|
Les chaînes de format doivent être comprises dans des conditions préalables |
|
Pour la fonction, erreur de syntaxe dans le paramètre |
|
Pour la fonction, erreur de syntaxe près de la fin |
|
Pour la fonction, erreur de syntaxe dans l'annotation _At_() (nom de paramètre non reconnu) |
|
Pour la fonction, erreur de syntaxe 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 extra _Deref_ a été trouvé dans une annotation. |
|
Un opérateur _Deref_ ambigu a été trouvé dans une annotation. |
|
Un opérateur _Notref_ placé de manière incorrecte et appliqué à un jeton a été trouvé. |
|
Une erreur a été détectée pendant l'analyse d'un jeton. |
|
L'annotation décrit une situation qui n'est pas applicable de manière conditionnelle. |
|
L'annotation décrit l'emplacement auquel une valeur dynamique (une variable) ne peut pas être utilisée dans la condition. |