Exemplarische Vorgehensweise: Analysieren von C/C++-Code auf Fehler
Diese exemplarische Vorgehensweise veranschaulicht, wie C/C++-Code mithilfe des Codeanalysetools für C/C++-Code auf potenzielle Fehler analysiert wird.
Im Folgenden wird exemplarisch Schritt für Schritt die Verwendung der Codeanalyse zum Auffinden potenzieller Fehler im C/C++-Code beschrieben.
Sie führen dabei folgende Schritte aus:
Ausführen der Codeanalyse für systemeigenen Code
Analysieren von Codefehlerwarnungen
Behandeln von Warnungen als Fehler
Hinzufügen von Anmerkungen zum Quellcode zur Verbesserung der Codefehleranalyse
Vorbereitungsmaßnahmen
Visual Studio 2005 Team System
Eine Kopie von Demobeispiel
Ein grundlegendes Verständnis von C/C++
So führen Sie die Codefehleranalyse für systemeigenem Code aus
Öffnen Sie die Demoprojektmappe in Visual Studio 2005 Team System.
Die Demoprojektmappe wird jetzt im Projektmappen-Explorer angezeigt.
Klicken Sie im Menü Erstellen auf Projektmappe neu erstellen.
Die Projektmappe wird ohne Fehler oder Warnungen erstellt.
Wählen Sie im Projektmappen-Explorer das Projekt CodeDefects aus.
Klicken Sie im Menü Projekt auf Eigenschaften.
Das Dialogfeld CodeDefects-Eigenschaftenseiten wird angezeigt.
Klicken Sie auf Codeanalyse.
Wählen Sie in der Dropdownliste Codeanalyse für C/C++ aktivieren die Option Ja (/analyze) aus, und klicken Sie dann auf OK.
Erstellen Sie das Projekt CodeDefects neu.
Im Ausgabefenster werden Codeanalysewarnungen angezeigt.
So analysieren Sie Warnungen zu Codeinitialisierungsfehlern
Klicken Sie im Menü Ansicht auf Fehlerliste.
Je nach dem in Visual Studio 2005 Team System ausgewählten Entwicklerprofil müssen Sie im Menü Ansicht möglicherweise zuerst auf Weitere Fenster zeigen, bevor Sie auf Fehlerliste klicken können.
Doppelklicken Sie in der Fehlerliste auf die folgende Warnung:
Warnung C6230: Implizite Umwandlung zwischen semantisch unterschiedlichen Integer-Typen: HRESULT wird in einem Boolean-Kontext verwendet.
Die Zeile, die die Warnung in der Funktion
bool
ProcessDomain()
verursacht hat, wird im Code-Editor angezeigt. Diese Warnung bedeutet, dass in einer 'if'-Anweisung HRESULT verwendet wird, obwohl ein boolesches Ergebnis erwartet wurde.Korrigieren Sie diese Warnung mithilfe des SUCCEEDED-Makros. Der Code sollte ungefähr wie folgt aussehen:
if (SUCCEEDED (ReadUserAccount()) )
Doppelklicken Sie in der Fehlerliste auf die folgende Warnung:
Warnung C6282: Falscher Operator: Zuweisung zu Konstante in Testkontext. War == beabsichtigt?
Korrigieren Sie diese Warnung, indem Sie auf Gleichheit testen. Der Code sollte ungefähr wie folgt aussehen:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
So behandeln Sie Warnungen als Fehler
Fügen Sie am Anfang der Datei Bug.cpp die folgende
#pragma
-Anweisung hinzu, um die Warnung C6001 als Fehler zu behandeln:#pragma warning (error: 6001)
Erstellen Sie das Projekt CodeDefects neu.
In der Fehlerliste wird C6001 jetzt als Fehler angezeigt.
Korrigieren Sie die verbleibenden beiden C6001-Fehler in der Fehlerliste, indem Sie
i
undj
mit 0 (null) initialisieren.Erstellen Sie das Projekt CodeDefects neu.
Das Projekt wird ohne Warnungen oder Fehler erstellt.
So korrigieren Sie die Warnungen zu Quellcodeanmerkungen in annotation.c
Wählen Sie im Projektmappen-Explorer das Projekt Annotations aus.
Klicken Sie im Menü Projekt auf Eigenschaften.
Das Dialogfeld Annotations-Eigenschaftenseiten wird angezeigt.
Klicken Sie auf Codeanalyse.
Wählen Sie in der Dropdownliste Codeanalyse für C/C++ aktivieren die Option Ja (/analyze) aus, und klicken Sie dann auf OK.
Erstellen Sie das Projekt Annotations neu.
Doppelklicken Sie in der Fehlerliste auf die folgende Warnung:
Warnung C6011: NULL-Zeiger 'newNode' wird dereferenziert.
Diese Warnung gibt an, dass der Aufrufer den Rückgabewert nicht überprüfen kann. In diesem Fall wird bei einem Aufruf von AllocateNode möglicherweise ein NULL-Wert zurückgegeben. (Die Funktionsdeklaration für AllocateNode finden Sie in der Headerdatei annotations.h).
Öffnen Sie die Datei Annotation.c.
Verwenden Sie zum Korrigieren dieser Warnung eine 'if'-Anweisung, um den Rückgabewert zu testen. Der Code sollte ungefähr wie folgt aussehen:
if (NULL != newNode)
{
newNode->data = value;
newNode->next = 0;
node->next = newNode;
}
Erstellen Sie das Projekt Annotations neu.
Das Projekt wird ohne Warnungen oder Fehler erstellt.
So verwenden Sie Quellcodeanmerkungen
Fügen Sie den formalen Parametern und dem Rückgabewert der Funktion
AddTail
mithilfe der Vor- und Nachbedingung Anmerkungen hinzu, wie in diesem Beispiel dargestellt:[SA_Post (Null=SA_Maybe)] LinkedList* AddTail
(
[SA_Pre(Null=SA_Maybe)] LinkedList* node,
int value
)
Erstellen Sie das Projekt Annotations neu.
Doppelklicken Sie in der Fehlerliste auf die folgende Warnung:
Warnung C6011: NULL-Zeiger 'node' wird dereferenziert.
Diese Warnung bedeutet, dass der an die Funktion übergebene Knoten möglicherweise NULL ist.
Verwenden Sie zum Korrigieren dieser Warnung eine 'if'-Anweisung, um den Rückgabewert zu testen. Der Code sollte ungefähr wie folgt aussehen:
. . . LinkedList *newNode = NULL; if (NULL == node) { return NULL; . . . }
Erstellen Sie das Projekt Annotations neu.
Das Projekt wird ohne Warnungen oder Fehler erstellt.
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Analysieren von verwaltetem Code auf Codefehler