Share via


C++-Beispielprojekt für die Codeanalyse

Die folgenden Verfahren zeigen, wie Sie das Beispiel für exemplarische Vorgehensweise erstellen: Analysieren sie C/C++-Code auf Fehler. Mithilfe dieser Prozeduren wird Folgendes erstellt:

  • Eine Visual Studio-Projektmappe mit dem Namen "CppDemo".

  • Ein statisches Bibliotheksprojekt mit dem Namen "CodeDefects".

  • Ein statisches Bibliotheksprojekt mit dem Namen Annotations.

Die Prozeduren stellen zudem den Code für den Header und die .cpp-Dateien für die statischen Bibliotheken bereit.

Erstellen der CppDemo-Projektmappe und des CodeDefects-Projekts

  1. Öffnen Sie Visual Studio, und wählen Sie " Neues Projekt erstellen" aus.

  2. Ändern Sie im Dialogfeld "Neues Projekt erstellen" den Sprachfilter in C++.

  3. Wählen Sie den Windows-Desktop-Assistenten und dann die Schaltfläche "Weiter " aus.

  4. Geben Sie auf der Seite "Neues Projekt konfigurieren" im Textfeld "Projektname" "CodeDefects" ein.

  5. Geben Sie im Textfeld "Lösungsname" "CppDemo" ein.

  6. Wählen Sie Erstellen aus.

  7. Ändern Sie im Dialogfeld "Windows Desktop Project " den Anwendungstyp in "Static Library (.lib)".

  8. Wählen Sie unter Zusätzliche Optionendie Option Leeres Projektaus.

  9. Wählen Sie "OK" aus, um die Projektmappe und das Projekt zu erstellen.

  1. Öffnen Sie Visual Studio. Klicken Sie in der Menüleiste auf Datei>Neu>Projekt.

  2. Wählen Sie im Dialogfeld "Neues Projekt" die Option "Visual C++>Windows Desktop" aus.

  3. Wählen Sie den Windows-Desktop-Assistenten aus.

  4. Geben Sie im Textfeld "Name " " CodeDefects" ein.

  5. Geben Sie im Textfeld "Lösungsname" "CppDemo" ein.

  6. Wählen Sie OK aus.

  7. Ändern Sie im Dialogfeld "Windows Desktop Project " den Anwendungstyp in "Static Library (.lib)".

  8. Wählen Sie unter Zusätzliche Optionendie Option Leeres Projektaus.

  9. Wählen Sie "OK" aus, um die Projektmappe und das Projekt zu erstellen.

  1. Öffnen Sie Visual Studio. Klicken Sie in der Menüleiste auf Datei>Neu>Projekt.

  2. Wählen Sie im Dialogfeld "Neues Projekt" die Option "Vorlagen>Visual C++>Win32" aus.

  3. Wählen Sie "Win32-Konsolenanwendung" aus.

  4. Geben Sie im Textfeld "Name " " CodeDefects" ein.

  5. Geben Sie im Textfeld "Lösungsname" "CppDemo" ein.

  6. Wählen Sie OK aus.

  7. Wählen Sie im Dialogfeld "Win32-Anwendungs-Assistent " die Schaltfläche "Weiter " aus.

  8. Ändern Sie den Anwendungstyp in statische Bibliothek.

  9. Heben Sie unter "Zusätzliche Optionen" die Option "Vorkompilierte Kopfzeile" auf.

  10. Wählen Sie "Fertig stellen" aus, um die Projektmappe und das Projekt zu erstellen.

Hinzufügen der Kopf- und Quelldatei zum CodeDefects-Projekt

  1. Erweitern Sie in Projektmappen-Explorer "CodeDefects".

  2. Klicken Sie mit der rechten Maustaste, um das Kontextmenü für Headerdateien zu öffnen. Wählen Sie Hinzufügen>Neues Element aus.

  3. Wählen Sie im Dialogfeld "Neues Element hinzufügen" visual C++>Code aus, und wählen Sie dann "Headerdatei (.h)" aus.

  4. Geben Sie im Bearbeitungsfeld "Name" "Bug.h" ein, und wählen Sie dann die Schaltfläche "Hinzufügen" aus.

  5. Wählen Sie im Bearbeitungsfenster für Bug.h den Inhalt aus, und löschen Sie sie.

  6. Kopieren Sie den folgenden Code und fügen Sie ihn im Editor in der Datei Bug.h ein.

    #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;
    
  7. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste, um das Kontextmenü für Quelldateien zu öffnen. Wählen Sie Hinzufügen>Neues Element aus.

  8. Klicken Sie im Dialogfeld Neues Element hinzufügen auf C++-Datei (.cpp).

  9. Geben Sie im Bearbeitungsfeld "Name" "Bug.cpp" ein, und wählen Sie dann die Schaltfläche "Hinzufügen" aus.

  10. Kopieren Sie den folgenden Code und fügen Sie ihn im Editor in der Datei Bug.cpp ein.

    #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;
    }
    
  11. Klicken Sie in der Menüleiste auf Datei>Alle speichern.

Hinzufügen des Annotations-Projekts und Konfigurieren dieses Projekts als statische Bibliothek

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf "CppDemo", um das Kontextmenü zu öffnen. Wählen Sie Hinzufügen>Neues Projekt aus.

  2. Wählen Sie im Dialogfeld "Neues Projekt hinzufügen" den Windows-Desktop-Assistenten und dann die Schaltfläche "Weiter" aus.

  3. Geben Sie auf der Seite "Neues Projekt konfigurieren" im Textfeld "Projektname" Anmerkungen ein, und wählen Sie dann "Erstellen" aus.

  4. Ändern Sie im Dialogfeld "Windows Desktop Project " den Anwendungstyp in "Static Library (.lib)".

  5. Wählen Sie unter Zusätzliche Optionendie Option Leeres Projektaus.

  6. Klicken Sie auf OK, um das Projekt zu erstellen.

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf "CppDemo", um das Kontextmenü zu öffnen. Wählen Sie Hinzufügen>Neues Projekt aus.

  2. Wählen Sie im Dialogfeld "Neues Projekt hinzufügen" die Option "Visual C++>Windows Desktop" aus.

  3. Wählen Sie den Windows-Desktop-Assistenten aus.

  4. Geben Sie im Textfeld "Name" Anmerkungen ein, und wählen Sie dann "OK" aus.

  5. Ändern Sie im Dialogfeld "Windows Desktop Project " den Anwendungstyp in "Static Library (.lib)".

  6. Wählen Sie unter Zusätzliche Optionendie Option Leeres Projektaus.

  7. Klicken Sie auf OK, um das Projekt zu erstellen.

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf "CppDemo", um das Kontextmenü zu öffnen. Wählen Sie Hinzufügen>Neues Projekt aus.

  2. Wählen Sie im Dialogfeld "Neues Projekt hinzufügen" visual C++>Win32 aus.

  3. Wählen Sie "Win32-Konsolenanwendung" aus.

  4. Geben Sie im Textfeld "Name" Anmerkungen ein.

  5. Wählen Sie OK aus.

  6. Wählen Sie im Dialogfeld "Win32-Anwendungs-Assistent " die Schaltfläche "Weiter " aus.

  7. Ändern Sie den Anwendungstyp in statische Bibliothek.

  8. Heben Sie unter "Zusätzliche Optionen" die Option "Vorkompilierte Kopfzeile" auf.

  9. Klicken Sie auf Fertig stellen, um das Projekt zu erstellen.

Hinzufügen der Headerdatei und Quelldatei zum Annotations-Projekt

  1. Erweitern Sie in Projektmappen-Explorer Anmerkungen.

  2. Klicken Sie mit der rechten Maustaste, um das Kontextmenü für Kopfzeilendateien unter Anmerkungen zu öffnen. Wählen Sie Hinzufügen>Neues Element aus.

  3. Wählen Sie im Dialogfeld "Neues Element hinzufügen" visual C++>Code aus, und wählen Sie dann "Headerdatei (.h)" aus.

  4. Geben Sie im Bearbeitungsfeld "Name" anmerkungen.h ein, und wählen Sie dann die Schaltfläche "Hinzufügen" aus.

  5. Wählen Sie im Bearbeitungsfenster für annotations.h den Inhalt aus, und löschen Sie sie.

  6. Kopieren Sie den folgenden Code, und fügen Sie ihn im Editor in der Datei annotations.h ein.

    #pragma once
    #include <sal.h>
    
    struct LinkedList
    {
        struct LinkedList* next;
        int data;
    };
    
    typedef struct LinkedList LinkedList;
    
    _Ret_maybenull_ LinkedList* AllocateNode();
    
  7. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste, um das Kontextmenü für Quelldateien unter Anmerkungen zu öffnen. Wählen Sie Hinzufügen>Neues Element aus.

  8. Klicken Sie im Dialogfeld Neues Element hinzufügen auf C++-Datei (.cpp).

  9. Geben Sie im Bearbeitungsfeld "Name" "annotations.cpp" ein, und wählen Sie dann die Schaltfläche "Hinzufügen" aus.

  10. Kopieren Sie den folgenden Code, und fügen Sie ihn im Editor in der Datei annotations.cpp ein.

    #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;
    }
    
  11. Klicken Sie in der Menüleiste auf Datei>Alle speichern.

Die Projektmappe ist jetzt fertig und sollte ohne Fehler erstellt werden.

Hinweis

In Visual Studio 2017 wird möglicherweise eine spurlose Warnung E1097 unknown attribute "no_init_all" im IntelliSense-Modul angezeigt. Sie können diese Warnung problemlos ignorieren.