Analyse de la qualité du code C++ des applications du Windows Store à l'aide de l'analyse du code Visual Studio
L'outil d'analyse du code dans Microsoft Visual Studio Express 2012 pour Windows 8 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 2012, Visual Studio Premium 2012 et Visual Studio Professional 2012, vous pouvez utiliser les fonctionnalités complètes de l'analyse du code. Consultez 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
Avertissements de l'analyse du code C++
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 :
Cliquez sur le nom du projet dans l'Explorateur de solutions, 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 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, cliquez sur 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. Si possible, l'analyse du code affiche le numéro de la ligne et la logique d'analyse qui a aboutit à l'avertissement.
Lorsque 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. Cliquez sur 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 Supprimer le message, puis Dans la source.
La suppression d'un message insère #pragma(warning:WarningId) 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 de mémoire non initialisée |
|
Suppression de la référence 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 |
|
La taille de la 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 mémoire tampon de chaîne de taille non valide |
|
Annotation non valide : la propriété 'NeedsRelease' ne peut pas être utilisée sur 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 : expression impossible à analyser |
|
Deref= ou Notref= 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 attendu d'arguments 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. |
|
Suppression de la référence 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 gauche pointe vers un struct, utiliser '->' |
|
L'opérande 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 s'applique uniquement aux post-conditions pour le paramètre de fonction spécifique. |
|
Pour une fonction, le nombre de paramètres de l'annotation ne correspond pas au nombre trouvé dans le fichier. |
|
Pour un 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 le paramètre dans l'annotation |
|
Expression d'entier attendue pour le 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 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 de l'annotation : impossible d'utiliser le 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 appliqué à aucune annotation |
|
pre, post ou deref appliqué à un bloc |
|
L'expression __at ne s'applique pas à la fonction active. |
|
La fonction ne peut pas constituer à elle seule une annotation. |
|
L'annotation ne peut pas être utilisée dans une expression. |
|
L'annotation sur un paramètre n'est plus prise en charge. |
|
L'annotation sur un paramètre possède plusieurs value, stringValue et longValue. Utiliser paramn=xxx |
|
L'annotation sur un paramètre possède à la fois value, stringValue ou longValue ; et paramn=xxx. Utiliser uniquement paramn=xxx |
|
L'annotation sur un paramètre possède un param2, mais pas un param1. |
|
L'annotation pour une fonction sur un paramètre n'est pas reconnue. |
|
L'annotation pour une fonction sur un paramètre nécessite plus de déréférencements que le type réel annoté ne le permet. |
|
L'annotation pour une fonction annote 'this' sur une fonction non membre. |
|
L'annotation de paramètre pour une fonction 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 : un paramètre possède d'autres annotations sur cette instance. |
|
Annotation incohérente pour une fonction : un paramètre possède 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 une annotation. |
|
Une erreur de syntaxe dans une annotation conditionnelle a été trouvée pour une 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 une annotation dans la fonction. |
|
L'annotation pour une fonction, paramètre lors de l'examen, est incohérente avec la déclaration de la fonction. |
|
Pour une fonction, les indices sont incohérents avec la déclaration de la fonction. |
|
Le paramètre de _Macro_value_ a la valeur null. |
|
Pour un symbole, un 'begin' a été trouvé sans un 'end' correspondant. |
|
Pour un symbole, un 'end' a été trouvé sans un 'begin' correspondant. |
|
Les chaînes de format doivent être comprises dans des conditions préalables. |
|
Pour une fonction, erreur de syntaxe dans un paramètre |
|
Pour une fonction, erreur de syntaxe proche de la fin |
|
Pour une fonction, erreur de syntaxe dans l'annotation _At_() (nom de paramètre non reconnu) |
|
Pour une fonction, erreur de syntaxe dans l'annotation _At_() (nom de paramètre non valide) |
|
Pour une fonction : aucune limite n'a été spécifiée en tant que paramètre pour ReadableTo ou WritableTo. |
|
L'annotation pour une fonction contient plus d'externes que le nombre réel de paramètres. |
|
Post null/notnull au niveau 0 deref n'a pas de sens pour une 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 lors de l'analyse d'un jeton. |
|
L'annotation décrit une situation qui n'est pas applicable de manière conditionnelle. |
|
L'annotation décrit les conditions dans lesquelles une valeur dynamique (une variable) ne peut pas être utilisée dans la condition. |