Exemplarische Vorgehensweise: Analysieren von C/C++-Code für Fehler
In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie C/C++-Code auf potenzielle Codefehler analysiert wird. Es verwendet die Codeanalysetools für C/C++-Code.
In dieser exemplarischen Vorgehensweise gehen Sie wie folgt vor:
- Führen Sie codeanalyse auf systemeigenem Code aus.
- Analysieren Sie Codefehlerwarnungen.
- Warnung als Fehler behandeln.
- Kommentieren Sie Quellcode, um die Analyse von Codefehlern zu verbessern.
Voraussetzungen
- Eine Kopie des CppDemo-Beispiels.
- Grundlegendes Verständnis von C/C++.
Ausführen der Codeanalyse auf systemeigenem Code
So führen Sie Codefehleranalyse für systemeigenen Code aus
Öffnen Sie die CppDemo-Projektmappe in Visual Studio.
Die CppDemo-Lösung füllt jetzt Projektmappen-Explorer auf.
Wählen Sie im Menü Erstellen die Option Projektmappe neu erstellen aus.
Die Lösung erstellt ohne Fehler oder Warnungen.
Wählen Sie in Projektmappen-Explorer das Projekt "CodeDefects" aus.
Klicken Sie im Menü Projekt auf Eigenschaften.
Das Dialogfeld "Eigenschaftenseiten von CodeDefects" wird angezeigt.
Wählen Sie die Codeanalyse-Eigenschaftenseite aus.
Ändern Sie die Eigenschaft "Codeanalyse für Build aktivieren" in "Ja". Klicken Sie auf OK, um die Änderungen zu speichern.
Erstellen Sie das CodeDefects-Projekt neu.
Codeanalysewarnungen werden im Fehlerlistenfenster angezeigt.
Öffnen Sie die CppDemo-Projektmappe in Visual Studio.
Die CppDemo-Lösung füllt jetzt Projektmappen-Explorer auf.
Wählen Sie im Menü Erstellen die Option Projektmappe neu erstellen aus.
Die Lösung erstellt ohne Fehler oder Warnungen.
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.Wählen Sie in Projektmappen-Explorer das Projekt "CodeDefects" aus.
Klicken Sie im Menü Projekt auf Eigenschaften.
Das Dialogfeld "Eigenschaftenseiten von CodeDefects" wird angezeigt.
Wählen Sie die Codeanalyse-Eigenschaftenseite aus.
Aktivieren Sie das Kontrollkästchen "Codeanalyse auf Build aktivieren". Klicken Sie auf OK, um die Änderungen zu speichern.
Erstellen Sie das CodeDefects-Projekt neu.
Codeanalysewarnungen werden im Fehlerlistenfenster angezeigt.
So analysieren Sie Codefehlerwarnungen
Wählen Sie im Menü Ansicht die Option Fehlerliste aus.
Dieses Menüelement ist möglicherweise nicht sichtbar. Dies hängt vom Entwicklerprofil ab, das Sie in Visual Studio ausgewählt haben. Möglicherweise müssen Sie im Menü "Ansicht" auf "Andere Fenster" zeigen und dann "Fehlerliste" auswählen.
Doppelklicken Sie im Fenster "Fehlerliste " auf die folgende Warnung:
C6230: Implizite Umwandlung zwischen semantisch unterschiedlichen Typen: Verwenden von HRESULT in einem booleschen Kontext.
Der Code-Editor zeigt die Zeile an, die die Warnung innerhalb der Funktion
bool ProcessDomain()
verursacht hat. Diese Warnung gibt an, dass eineHRESULT
In einer "if"-Anweisung verwendet wird, in der ein boolesches Ergebnis erwartet wird. Dies ist in der Regel ein Fehler, da dasS_OK
HRESULT von einer Funktion zurückgegeben wird, die Erfolg anzeigt, aber wenn es in einen booleschen Wert konvertiert wird, in den es ausgewertet wirdfalse
.Korrigieren Sie diese Warnung mithilfe des
SUCCEEDED
Makros, in das konvertiert wirdtrue
, wenn einHRESULT
Rückgabewert auf Erfolg hinweist. Ihr Code sollte dem folgenden Code ähneln:if (SUCCEEDED(ReadUserAccount()))
Doppelklicken Sie in der Fehlerliste auf die folgende Warnung:
C6282: Falscher Operator: Zuweisung einer Konstante im booleschen Kontext. Verwenden Sie stattdessen "==".
Korrigieren Sie diese Warnung, indem Sie auf Gleichheit testen. Ihr Code sollte dem folgenden Code ähneln:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
Korrigieren Sie die verbleibenden C6001-Warnungen in der Fehlerliste , indem Sie initialisieren
i
undj
auf 0 festlegen.Erstellen Sie das CodeDefects-Projekt neu.
Das Projekt wird ohne Warnungen oder Fehler erstellt.
Korrigieren von Warnungen zur Quellcodeanmerkung
So aktivieren Sie die Warnungen zur Quellcodeanmerkung in annotation.c
Wählen Sie in Projektmappen-Explorer das Projekt "Anmerkungen" aus.
Klicken Sie im Menü Projekt auf Eigenschaften.
Das Dialogfeld "Eigenschaftenseiten für Anmerkungen" wird angezeigt.
Wählen Sie die Codeanalyse-Eigenschaftenseite aus.
Ändern Sie die Eigenschaft "Codeanalyse für Build aktivieren" in "Ja". Klicken Sie auf OK, um die Änderungen zu speichern.
Wählen Sie in Projektmappen-Explorer das Projekt "Anmerkungen" aus.
Klicken Sie im Menü Projekt auf Eigenschaften.
Das Dialogfeld "Eigenschaftenseiten für Anmerkungen" wird angezeigt.
Wählen Sie die Codeanalyse-Eigenschaftenseite aus.
Aktivieren Sie das Kontrollkästchen "Codeanalyse auf Build aktivieren". Klicken Sie auf OK, um die Änderungen zu speichern.
So korrigieren Sie die Warnungen der Quellcodeanmerkung in annotation.c
Erstellen Sie das Annotations-Projekt neu.
Wählen Sie im Menü "Erstellen " die Option "Codeanalyse für Anmerkungen ausführen" aus.
Doppelklicken Sie in der Fehlerliste auf die folgende Warnung:
C6011: Dereferencing NULL-Zeiger 'newNode'.
Diese Warnung gibt an, dass der Aufrufer den Rückgabewert überprüft. In diesem Fall gibt ein Aufruf möglicherweise
AllocateNode
einen NULL-Wert zurück. Die Headerdatei "annotations.h" finden Sie in der Funktionsdeklaration fürAllocateNode
.Der Cursor befindet sich an der Position in der annotations.cpp Datei, an der die Warnung aufgetreten ist.
Verwenden Sie zum Korrigieren dieser Warnung eine "if"-Anweisung, um den Rückgabewert zu testen. Ihr Code sollte dem folgenden Code ähneln:
LinkedList* newNode = AllocateNode(); if (nullptr != newNode) { newNode->data = value; newNode->next = 0; node->next = newNode; }
Erstellen Sie das Annotations-Projekt neu.
Das Projekt wird ohne Warnungen oder Fehler erstellt.
Verwenden der Quellcodeanmerkung zum Ermitteln weiterer Probleme
So verwenden Sie die Quellcodeanmerkung
Kommentieren Sie formale Parameter und rückgabewert der Funktion
AddTail
, um anzugeben, dass die Zeigerwerte null sein können:_Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)
Wählen Sie im Menü Build die Option Codeanalyse für Lösung ausführen aus.
Doppelklicken Sie in der Fehlerliste auf die folgende Warnung:
C6011: Dereferencing NULL-Zeiger 'node'.
Diese Warnung gibt an, dass der an die Funktion übergebene Knoten null sein kann.
Um diese Warnung zu korrigieren, verwenden Sie am Anfang der Funktion eine "if"-Anweisung, um den übergebenen Wert zu testen. Ihr Code sollte dem folgenden Code ähneln:
if (nullptr == node) { return nullptr; }
Wählen Sie im Menü Build die Option Codeanalyse für Lösung ausführen aus.
Das Projekt erstellt jetzt ohne Warnungen oder Fehler.
Siehe auch
Exemplarische Vorgehensweise: Analysieren von verwaltetem Code auf Codefehler
Codeanalyse für C/C++