Partager via


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 :

  1. Cliquez sur le nom du projet dans l'Explorateur de solutions, puis choisissez Propriétés.

  2. 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.

Fenêtre d'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.

Avertissements liés à l'analyse du code développé

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.

Code source en surbrillance

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 :

  1. Si les informations détaillées ne s'affichent pas, développez le titre de l'avertissement.

  2. Cliquez sur le lien Actions au bas de l'avertissement.

  3. 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.

Rechercher et filtrer la fenêtre d'analyse du code

Avertissements de l'analyse du code C++

L'analyse du code génère les avertissements suivants pour le code C++ :

Règle

Description

C6001

Utilisation de mémoire non initialisée

C6011

Suppression de la référence du pointeur Null

C6029

Utilisation d'une valeur non vérifiée

C6053

Terminaison par zéro de l'appel

C6059

Concaténation non valide

C6063

Argument de chaîne manquant pour le formatage de la fonction

C6064

Argument d'entier manquant pour le formatage de la fonction

C6066

Argument de pointeur manquant pour le formatage de la fonction

C6067

Argument de pointeur de chaîne manquant pour le formatage de la fonction

C6101

Retour d'une mémoire non initialisée

C6200

L'index dépasse la taille maximale autorisée par la mémoire tampon.

C6201

L'index dépasse la taille maximale autorisée par la mémoire tampon allouée par la pile.

C6270

Argument float manquant pour le formatage de la fonction

C6271

Argument supplémentaire pour le formatage de la fonction

C6272

Argument non float pour le formatage de la fonction

C6273

Argument non entier pour le formatage de la fonction

C6274

Argument autre qu'un caractère pour le formatage de la fonction

C6276

Transtypage de chaîne non valide

C6277

Appel CreateProcess non valide

C6284

Argument d'objet non valide pour le formatage de la fonction

C6290

Priorité NOT logique et AND au niveau du bit

C6291

Priorité NOT logique et OR au niveau du bit

C6302

Argument de chaîne de caractères non valide pour le formatage de la fonction

C6303

Argument de chaîne de caractères larges non valide pour le formatage de la fonction

C6305

Incompatibilité entre la taille et la quantité

C6306

Appel de fonction d'argument de variable non valide

C6328

Incompatibilité de type d'argument possible

C6385

Dépassement en lecture

C6386

Dépassement en écriture

C6387

Valeur de paramètre non valide

C6500

Propriété d'attribut non valide

C6501

Valeurs de propriété d'attribut en conflit

C6503

Les références ne peuvent pas être Null.

C6504

Null sur élément non pointeur

C6505

MustCheck sur Void

C6506

Taille de mémoire tampon sur élément non pointeur ou tableau

C6507

Incompatibilité de null au déréférencement nul

C6508

Accès en écriture sur constante

C6509

Retour utilisé sur condition préalable

C6510

Terminaison par Null sur élément non pointeur

C6511

MustCheck doit avoir la valeur Yes ou No

C6513

Taille d'élément sans taille de mémoire tampon

C6514

La taille de la mémoire tampon dépasse la taille du tableau.

C6515

Taille de la mémoire tampon sur élément non pointeur

C6516

Attribut sans propriété

C6517

Taille valide dans mémoire tampon non lisible

C6518

Taille accessible en écriture dans mémoire tampon non accessible en écriture

C6519

Annotation non valide : la propriété 'NeedsRelease' doit avoir la valeur Yes ou No.

C6521

Déréférencement de chaîne de taille non valide

C6522

Type de chaîne de taille non valide

C6523

Paramètre de chaîne de taille non valide

C6525

Chaîne de taille non valide. Emplacement inaccessible.

C6526

Type de mémoire tampon de chaîne de taille non valide

C6527

Annotation non valide : la propriété 'NeedsRelease' ne peut pas être utilisée sur des valeurs de type void.

C6530

Style de chaîne de format non reconnu

C6540

L'utilisation d'annotations d'attribut sur cette fonction invalidera l'ensemble de ses annotations __declspec existantes.

C6551

Spécification de taille non valide : expression impossible à analyser

C6552

Deref= ou Notref= non valide : expression impossible à analyser

C6701

La valeur n'est pas une valeur Yes/No/Maybe valide.

C6702

La valeur n'est pas une valeur de chaîne.

C6703

La valeur n'est pas un nombre.

C6704

Erreur d'expression de l'annotation inattendue

C6705

Le nombre attendu d'arguments pour l'annotation ne correspond pas au nombre réel d'arguments pour l'annotation.

C6706

Erreur d'annotation inattendue pour l'annotation

C28021

Le paramètre annoté doit être un pointeur.

C28182

Suppression de la référence du pointeur Null. Le pointeur contient la même valeur NULL qu'un autre pointeur.

C28202

Référence non autorisée à un membre non statique

C28203

Référence ambiguë à un membre de classe.

C28205

_Success_ ou _On_failure_ utilisé dans un contexte non autorisé

C28206

L'opérande gauche pointe vers un struct, utiliser '->'

C28207

L'opérande gauche est un struct, utiliser '.'

C28210

Les annotations pour le contexte __On_failure_ ne doivent pas se trouver dans un contexte préalable explicite.

C28211

Nom du contexte statique attendu pour SAL_context

C28212

Expression de pointeur attendue pour l'annotation

C28213

L'annotation _Use_decl_annotations_ doit être utilisée pour référencer, sans modification, une déclaration antérieure.

C28214

Les noms des paramètres d'attribut doivent être p1...p9.

C28215

Le typefix ne peut pas être appliqué à un paramètre qui contient déjà un typefix.

C28216

L'annotation checkReturn s'applique uniquement aux post-conditions pour le paramètre de fonction spécifique.

C28217

Pour une fonction, le nombre de paramètres de l'annotation ne correspond pas au nombre trouvé dans le fichier.

C28218

Pour un paramètre de fonction, le paramètre de l'annotation ne correspond pas au paramètre trouvé dans le fichier.

C28219

Membre de l'énumération attendu pour le paramètre dans l'annotation

C28220

Expression d'entier attendue pour le paramètre dans l'annotation

C28221

Expression de chaîne attendue pour le paramètre dans l'annotation

C28222

__yes, __no ou __maybe attendu pour l'annotation

C28223

Jeton/identificateur attendu introuvable pour l'annotation, paramètre

C28224

L'annotation requiert des paramètres.

C28225

Nombre correct de paramètres requis introuvable dans l'annotation

C28226

L'annotation ne peut pas être également un PrimOp (dans la déclaration actuelle).

C28227

L'annotation ne peut pas être également un PrimOp (voir la déclaration antérieure).

C28228

Paramètre de l'annotation : impossible d'utiliser le type dans les annotations

C28229

L'annotation ne prend pas en charge les paramètres.

C28230

Le type de paramètre ne contient pas de membre.

C28231

L'annotation n'est valide que sur un tableau.

C28232

pre, post ou deref appliqué à aucune annotation

C28233

pre, post ou deref appliqué à un bloc

C28234

L'expression __at ne s'applique pas à la fonction active.

C28235

La fonction ne peut pas constituer à elle seule une annotation.

C28236

L'annotation ne peut pas être utilisée dans une expression.

C28237

L'annotation sur un paramètre n'est plus prise en charge.

C28238

L'annotation sur un paramètre possède plusieurs value, stringValue et longValue. Utiliser paramn=xxx

C28239

L'annotation sur un paramètre possède à la fois value, stringValue ou longValue ; et paramn=xxx. Utiliser uniquement paramn=xxx

C28240

L'annotation sur un paramètre possède un param2, mais pas un param1.

C28241

L'annotation pour une fonction sur un paramètre n'est pas reconnue.

C28243

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.

C28245

L'annotation pour une fonction annote 'this' sur une fonction non membre.

C28246

L'annotation de paramètre pour une fonction ne correspond pas au type du paramètre.

C28250

Annotation incohérente pour une fonction : l'instance précédente contient une erreur.

C28251

Annotation incohérente pour une fonction : cette instance contient une erreur.

C28252

Annotation incohérente pour une fonction : un paramètre possède d'autres annotations sur cette instance.

C28253

Annotation incohérente pour une fonction : un paramètre possède d'autres annotations sur cette instance.

C28254

Dynamic_cast<>() n'est pas pris en charge dans les annotations.

C28262

Une erreur de syntaxe dans l'annotation a été trouvée dans la fonction, pour une annotation.

C28263

Une erreur de syntaxe dans une annotation conditionnelle a été trouvée pour une annotation intrinsèque.

C28264

Les valeurs des listes de résultats doivent être des constantes.

C28267

Une erreur de syntaxe dans les annotations a été trouvée pour une annotation dans la fonction.

C28272

L'annotation pour une fonction, paramètre lors de l'examen, est incohérente avec la déclaration de la fonction.

C28273

Pour une fonction, les indices sont incohérents avec la déclaration de la fonction.

C28275

Le paramètre de _Macro_value_ a la valeur null.

C28279

Pour un symbole, un 'begin' a été trouvé sans un 'end' correspondant.

C28280

Pour un symbole, un 'end' a été trouvé sans un 'begin' correspondant.

C28282

Les chaînes de format doivent être comprises dans des conditions préalables.

C28285

Pour une fonction, erreur de syntaxe dans un paramètre

C28286

Pour une fonction, erreur de syntaxe proche de la fin

C28287

Pour une fonction, erreur de syntaxe dans l'annotation _At_() (nom de paramètre non reconnu)

C28288

Pour une fonction, erreur de syntaxe dans l'annotation _At_() (nom de paramètre non valide)

C28289

Pour une fonction : aucune limite n'a été spécifiée en tant que paramètre pour ReadableTo ou WritableTo.

C28290

L'annotation pour une fonction contient plus d'externes que le nombre réel de paramètres.

C28291

Post null/notnull au niveau 0 deref n'a pas de sens pour une fonction.

C28300

Opérandes d'expression de types incompatibles pour l'opérateur

C28301

Aucune annotation pour la première déclaration de la fonction.

C28302

Un opérateur extra _Deref_ a été trouvé dans une annotation.

C28303

Un opérateur _Deref_ ambigu a été trouvé dans une annotation.

C28304

Un opérateur _Notref_ placé de manière incorrecte et appliqué à un jeton a été trouvé.

C28305

Une erreur a été détectée lors de l'analyse d'un jeton.

C28350

L'annotation décrit une situation qui n'est pas applicable de manière conditionnelle.

C28351

L'annotation décrit les conditions dans lesquelles une valeur dynamique (une variable) ne peut pas être utilisée dans la condition.