Partager via


Analyser la qualité du code C++ des applications du Windows Store à l'aide de l'analyse statique du code Visual Studio

S'applique à Windows et Windows Phone

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

C++ code analysis warnings

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. Dans l'Explorateur de solutions, sélectionnez le nom du projet, 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 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.

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

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

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.

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

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

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 d'une mémoire non initialisée

C6011

Déréférencement 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

Taille de 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 tampon de chaîne de taille non valide

C6527

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

C6530

Style de chaîne de format non reconnu

C6540

L'utilisation des annotations d'attribut sur cette fonction rendra non valides toutes ses annotations __declspec existantes

C6551

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

C6552

Deref= ou Noref= 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 d'arguments attendu 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

Déréférencement 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 de gauche pointe vers un struct, utiliser '->'

C28207

L'opérande de 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 ne s'applique qu'aux post-conditions pour le paramètre de fonction spécifique.

C28217

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

C28218

Pour le 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 une annotation, le paramètre dans l'annotation

C28220

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

C28221

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

C28222

__yes, __no ou __maybe attendus pour l'annotation

C28223

Jeton/identificateur 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 d'annotation : impossible d'utiliser ce 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 ne sont appliqués à aucune annotation

C28233

pre, post ou deref sont appliqués à un bloc

C28234

l'expression __at ne s'applique pas à la fonction actuelle

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 le paramètre n'est plus prise en charge

C28238

Plusieurs value, stringValue et longValue sont définies dans l'annotation sur le paramètre. Utiliser paramn=xxx

C28239

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

C28240

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

C28241

L'annotation pour la fonction sur le paramètre n'est pas reconnue

C28243

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.

C28245

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

C28246

L'annotation du paramètre 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 : le paramètre contient d'autres annotations sur cette instance.

C28253

Annotation incohérente pour une fonction : le paramètre contient 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 l'annotation

C28263

Une erreur de syntaxe dans une annotation conditionnelle a été trouvée pour l'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 l'annotation dans la fonction.

C28272

L'annotation pour la fonction, paramètre pendant la vérification est incohérente avec la déclaration de fonction

C28273

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

C28275

Le paramètre de _Macro_value_ a la valeur null

C28279

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

C28280

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

C28282

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

C28285

Pour la fonction, erreur de syntaxe dans le paramètre

C28286

Pour la fonction, erreur de syntaxe près de la fin

C28287

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

C28288

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

C28289

Pour la fonction : ReadableTo ou WritableTo n'a pas eu de spécification de limites en tant que paramètre

C28290

l'annotation pour la fonction contient plus d'Externals que le nombre réel de paramètres

C28291

post null/notnull au niveau 0 deref n'a pas de sens pour la 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 pendant 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 l'emplacement auquel une valeur dynamique (une variable) ne peut pas être utilisée dans la condition.