Exemple de projet C++ pour l’analyse du code
Les procédures suivantes vous montrent comment créer l’exemple de procédure pas à pas : analyser le code C/C++ pour détecter les défauts. Les procédures créent :
Solution Visual Studio nommée CppDemo.
Projet de bibliothèque statique nommé CodeDefects.
Projet de bibliothèque statique nommé Annotations.
Les procédures fournissent également le code pour les fichiers d’en-tête et .cpp pour les bibliothèques statiques.
Créer la solution CppDemo et le projet CodeDefects
Ouvrez Visual Studio et sélectionnez Créer un projet
Dans la boîte de dialogue Créer un projet , remplacez le filtre de langue par C++.
Sélectionnez l’Assistant Bureau Windows et choisissez le bouton Suivant .
Dans la page Configurer votre nouveau projet, dans la zone de texte Nom du projet, entrez CodeDefects.
Dans la zone de texte Nom de la solution, entrez CppDemo.
Cliquez sur Créer.
Dans la boîte de dialogue Projet de bureau Windows, remplacez le type d’application par bibliothèque statique (.lib).
Sous Options supplémentaires, sélectionnez Projet vide.
Choisissez OK pour créer la solution et le projet.
Ouvrir Visual Studio. Dans la barre de menus, choisissez Fichier>Nouveau>Projet.
Dans la boîte de dialogue Nouveau projet, sélectionnez Visual C++>Windows Desktop.
Sélectionnez l’Assistant Bureau Windows.
Dans la zone de texte Nom , entrez CodeDefects.
Dans la zone de texte Nom de la solution, entrez CppDemo.
Choisissez OK.
Dans la boîte de dialogue Projet de bureau Windows, remplacez le type d’application par bibliothèque statique (.lib).
Sous Options supplémentaires, sélectionnez Projet vide.
Choisissez OK pour créer la solution et le projet.
Ouvrir Visual Studio. Dans la barre de menus, choisissez Fichier>Nouveau>Projet.
Dans la boîte de dialogue Nouveau projet, sélectionnez Modèles>Visual C++>Win32.
Sélectionnez Application console Win32.
Dans la zone de texte Nom , entrez CodeDefects.
Dans la zone de texte Nom de la solution, entrez CppDemo.
Choisissez OK.
Dans la boîte de dialogue Assistant Application Win32, choisissez le bouton Suivant .
Remplacez le type d’application par bibliothèque statique.
Sous Options supplémentaires, désélectionnez l’en-tête précompilé.
Choisissez Terminer pour créer la solution et le projet.
Ajouter le fichier source et d’en-tête au projet CodeDefects
Dans Explorateur de solutions, développez CodeDefects.
Cliquez avec le bouton droit pour ouvrir le menu contextuel des fichiers d’en-tête. Choisissez Ajouter>Nouvel élément.
Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez Visual C++>Code, puis sélectionnez Fichier d’en-tête (.h).
Dans la zone De modification du nom , entrez Bug.h, puis choisissez le bouton Ajouter .
Dans la fenêtre d’édition de Bug.h, sélectionnez et supprimez le contenu.
Copiez le code suivant et collez-le dans le fichier Bug.h dans l’éditeur.
#pragma once #include <windows.h> // Function prototypes bool CheckDomain(wchar_t const *); HRESULT ReadUserAccount(); // These constants define the common sizes of the // user account information throughout the program const int USER_ACCOUNT_LEN = 256; const int ACCOUNT_DOMAIN_LEN = 128;
Dans Explorateur de solutions, cliquez avec le bouton droit pour ouvrir le menu contextuel des fichiers sources. Choisissez Ajouter>Nouvel élément.
Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez Fichier C++ (.cpp).
Dans la zone De modification du nom , entrez Bug.cpp, puis choisissez le bouton Ajouter .
Copiez le code suivant et collez-le dans le fichier Bug.cpp dans l’éditeur.
#include "Bug.h" // the user account wchar_t g_userAccount[USER_ACCOUNT_LEN] = { L"domain\\user" }; int len = 0; bool CheckDomain(wchar_t const* domain) { return (wcsnlen_s(domain, USER_ACCOUNT_LEN) > 0); } HRESULT ReadUserAccount() { return S_OK; } bool ProcessDomain() { wchar_t* domain = new wchar_t[ACCOUNT_DOMAIN_LEN]; // ReadUserAccount gets a 'domain\user' input from //the user into the global 'g_userAccount' if (ReadUserAccount()) { // Copies part of the string prior to the '\' // character onto the 'domain' buffer for (len = 0; (len < ACCOUNT_DOMAIN_LEN) && (g_userAccount[len] != L'\0'); len++) { if (g_userAccount[len] == L'\\') { // Stops copying on the domain and user separator ('\') break; } domain[len] = g_userAccount[len]; } if ((len = ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\')) { // '\' was not found. Invalid domain\user string. delete[] domain; return false; } else { domain[len] = L'\0'; } // Process domain string bool result = CheckDomain(domain); delete[] domain; return result; } return false; } int path_dependent(int n) { int i; int j; if (n == 0) i = 1; else j = 1; return i + j; }
Dans la barre de menus, sélectionnez Fichier>Enregistrer tout.
Ajouter le projet Annotations et le configurer comme bibliothèque statique
Dans Explorateur de solutions, cliquez avec le bouton droit sur CppDemo pour ouvrir le menu contextuel. Choisissez Ajouter>Nouveau projet.
Dans la boîte de dialogue Ajouter un nouveau projet , sélectionnez l’Assistant Bureau Windows, puis choisissez le bouton Suivant .
Dans la page Configurer votre nouveau projet, dans la zone de texte Nom du projet, entrez Annotations, puis choisissez Créer.
Dans la boîte de dialogue Projet de bureau Windows, remplacez le type d’application par bibliothèque statique (.lib).
Sous Options supplémentaires, sélectionnez Projet vide.
Choisissez OK pour créer le projet.
Dans Explorateur de solutions, cliquez avec le bouton droit sur CppDemo pour ouvrir le menu contextuel. Choisissez Ajouter>Nouveau projet.
Dans la boîte de dialogue Ajouter un nouveau projet, sélectionnez Visual C++>Windows Desktop.
Sélectionnez l’Assistant Bureau Windows.
Dans la zone de texte Nom , entrez Annotations, puis choisissez OK.
Dans la boîte de dialogue Projet de bureau Windows, remplacez le type d’application par bibliothèque statique (.lib).
Sous Options supplémentaires, sélectionnez Projet vide.
Choisissez OK pour créer le projet.
Dans Explorateur de solutions, cliquez avec le bouton droit sur CppDemo pour ouvrir le menu contextuel. Choisissez Ajouter>Nouveau projet.
Dans la boîte de dialogue Ajouter un nouveau projet, sélectionnez Visual C++>Win32.
Sélectionnez Application console Win32.
Dans la zone de texte Nom , entrez Annotations.
Choisissez OK.
Dans la boîte de dialogue Assistant Application Win32, choisissez le bouton Suivant .
Remplacez le type d’application par bibliothèque statique.
Sous Options supplémentaires, désélectionnez l’en-tête précompilé.
Choisissez Terminer pour créer le projet.
Ajouter le fichier d’en-tête et le fichier source au projet Annotations
Dans Explorateur de solutions, développez Annotations.
Cliquez avec le bouton droit pour ouvrir le menu contextuel des fichiers d’en-tête sous Annotations. Choisissez Ajouter>Nouvel élément.
Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez Visual C++>Code, puis sélectionnez Fichier d’en-tête (.h).
Dans la zone De modification du nom , entrez annotations.h, puis choisissez le bouton Ajouter .
Dans la fenêtre d’édition pour annotations.h, sélectionnez et supprimez le contenu.
Copiez le code suivant et collez-le dans le fichier annotations.h dans l’éditeur.
#pragma once #include <sal.h> struct LinkedList { struct LinkedList* next; int data; }; typedef struct LinkedList LinkedList; _Ret_maybenull_ LinkedList* AllocateNode();
Dans Explorateur de solutions, cliquez avec le bouton droit pour ouvrir le menu contextuel des fichiers sources sous Annotations. Choisissez Ajouter>Nouvel élément.
Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez Fichier C++ (.cpp).
Dans la zone De modification du nom , entrez annotations.cpp, puis choisissez le bouton Ajouter .
Copiez le code suivant et collez-le dans le fichier annotations.cpp dans l’éditeur.
#include "annotations.h" #include <malloc.h> _Ret_maybenull_ LinkedList* AllocateNode() { LinkedList* result = static_cast<LinkedList*>(malloc(sizeof(LinkedList))); return result; } LinkedList* AddTail(LinkedList* node, int value) { // finds the last node while (node->next != nullptr) { node = node->next; } // appends the new node LinkedList* newNode = AllocateNode(); newNode->data = value; newNode->next = 0; node->next = newNode; return newNode; }
Dans la barre de menus, sélectionnez Fichier>Enregistrer tout.
La solution est maintenant terminée et doit être générée sans erreur.
Remarque
Dans Visual Studio 2017, vous pouvez voir un avertissement E1097 unknown attribute "no_init_all"
faux dans le moteur IntelliSense. Vous pouvez ignorer cet avertissement en toute sécurité.