Analysieren der Codequalität von C++ bei Windows Store-Apps mit Visual Studio-Codeanalyse
Das Codeanalysetool in Microsoft Visual Studio Express 2012 für Windows 8 überprüft den Code auf eine Reihe von allgemeinen Problemen und Verstößen gegen gebräuchliche Programmiergrundlagen. Codeanalysewarnungen unterscheiden sich von C#-Compilerfehlern und -Warnungen, da die Codeanalyse nach bestimmten Codeschemata sucht, die gültig sind, jedoch Probleme für Sie oder andere Personen bereiten können, die den Code verwenden. Codeanalyse kann auch Fehler im Code suchen, die schwierig durch Tests zu erkennen sind. Das regelmäßige Ausführen des Codeanalysetools während des Entwicklungsprozesses kann die Qualität der App erhöhen.
Hinweis
In Visual Studio Ultimate 2012, Visual Studio Premium 2012 und Visual Studio Professional 2012 können Sie die Codeanalysefunktion verwenden. Siehe Analysieren der Anwendungsqualität mit Codeanalysetools in der MSDN Library.
In diesem Thema
Erfahren Sie:
Analysieren und Auflösen von Codeanalysewarnungen
Unterdrücken der Codeanalysewarnungen
Suchen und Filtern der Codeanalyseergebnisse
Ausführen der Codeanalyse
So führen Sie die Codeanalyse in der Visual Studio-Projektmappe aus
- Wählen Sie im Menü Erstellen die Option Codeanalyse für Lösung ausführen aus.
So führen Sie die Codeanalyse beim Erstellen eines Projekts jedes Mal automatisch aus
Wählen Sie im Projektmappen-Explorer den Projektnamen und dann Eigenschaften aus.
Wählen Sie auf der Seite der Projekteigenschaften Codeanalyse aus, und wählen Sie dann Codeanalyse für C/C++ beim Erstellen aktivieren aus.
Die Projektmappe wird kompiliert und die Codeanalyse ausgeführt. Die Ergebnisse werden im Codeanalysefenster angezeigt.
Analysieren und Auflösen von Codeanalysewarnungen
Um eine bestimmte Warnung zu analysieren, wählen Sie im Codeanalysefenster den Titel der Warnung aus. Die Warnung wird erweitert, um ausführliche Informationen zum Problem anzuzeigen. Wenn möglich, werden für die Codeanalyse die Zeilennummer und Analyselogik angezeigt, die zu der Warnung führten.
Wenn Sie eine Warnung erweitern, werden die Codezeilen, die die Warnung verursacht haben, im Visual Studio-Code-Editor hervorgehoben.
Nachdem Sie die Ursache des Problems verstanden haben, können Sie es im Code beheben. Wiederholen Sie dann die Codeanalyse, um sicherzustellen, dass die Warnung nicht mehr im Codeanalysefenster angezeigt wird, und dass durch die Korrektur keine neuen Warnungen ausgelöst wurden.
Tipp
Sie können die Codeanalyse im Codeanalysefenster erneut ausführen. Wählen Sie die Schaltfläche Analysieren und anschließend den Bereich der Analyse aus. Sie können die Analyse für die gesamte Projektmappe oder für ein ausgewähltes Projekt erneut ausführen.
Unterdrücken der Codeanalysewarnungen
Mitunter möchten Sie möglicherweise darauf verzichten, eine Codeanalysewarnung zu korrigieren. So kann es beispielsweise vorkommen, dass das Auflösen der Warnung im Verhältnis zur Wahrscheinlichkeit, dass das Problem in einer realen Implementierung des Codes auftritt, eine zu große Bearbeitung des Codes erfordert. Oder Sie gehen davon aus, dass die für die Warnung verwendete Analyse für den jeweiligen Kontext ungeeignet ist. Sie können Warnungen unterdrücken, sodass diese nicht mehr im Codeanalysefenster angezeigt werden.
So unterdrücken Sie eine Warnung
Wenn die ausführlichen Informationen nicht angezeigt werden, erweitern Sie den Titel der Warnung.
Wählen Sie unten in der Warnung den Link Aktionen aus.
Wählen Sie Meldung unterdrücken und dann In Quelle aus.
Beim Unterdrücken einer Meldung wird #pragma(warning:WarningId) hinzugefügt, um die Warnung für die Codezeile zu unterdrücken.
Suchen und Filtern der Codeanalyseergebnisse
Sie können lange Listen mit Warnmeldungen durchsuchen und Warnungen in Projektmappen mit mehreren Projekten filtern.
C++-Codeanalysewarnungen
Die Codeanalyse löst die folgenden Warnungen für C++-Code aus:
Regel |
Beschreibung |
---|---|
Nicht initialisierter Speicher wird verwendet |
|
Dereferenzierender NULL-Zeiger |
|
Verwendung von ungeprüftem Wert |
|
0 (null)-Abbruch des Aufrufs |
|
Fehlerhafte Verkettung |
|
Fehlendes Zeichenfolgenargument für Formatfunktion |
|
Fehlendes Ganzzahlargument für Formatfunktion |
|
Fehlendes Zeigerargument für Formatfunktion |
|
Fehlendes Zeichenfolgenzeigerargument für Formatfunktion |
|
Rückgabe von nicht initialisiertem Speicher |
|
Index überschreitet maximale Puffergröße |
|
Index überschreitet maximale Puffergröße |
|
Fehlendes Gleitkommaargument für Formatfunktion |
|
Zusätzliches Argument für Formatfunktion |
|
Nicht-Gleitkommaargument für Formatfunktion |
|
Nicht ganzzahliges Argument für Formatfunktion |
|
Nicht-Zeichenargument für Formatfunktion |
|
Ungültige Zeichenfolgenumwandlung |
|
Ungültiger CreateProcess-Aufruf |
|
Ungültiges Objektargument für Formatfunktion |
|
Logischer NOT-Operator hat Vorrang gegenüber bitweisem AND-Operator |
|
Logischer NOT-Operator hat Vorrang gegenüber bitweisem OR-Operator |
|
Ungültiges Zeichenfolgenargument für Formatfunktion |
|
Ungültige Zeichenfolgenargument mit Breitzeichen für Formatfunktion |
|
Keine Übereinstimmung bei Größe und Count-Verwendung |
|
Falscher Variablenargument-Funktionsaufruf |
|
Möglicherweise keine Übereinstimmung zwischen Argument und Typ |
|
Leseüberlauf |
|
Schreibüberlauf |
|
Ungültiger Parameterwert |
|
Ungültige Attributeigenschaft |
|
In Konflikt stehende Attributeigenschaftswerte |
|
Verweis darf nicht null sein |
|
NULL auf Nichtzeiger |
|
MustCheck für "void" |
|
Puffergröße auf Nichtzeiger oder Array |
|
NULL-Konflikt bei Dereferenzierungs-NULL |
|
Schreibzugriff auf Konstante |
|
Rückgabe wurde für Vorbedingung verwendet |
|
NULL für Nichtzeiger abgebrochen |
|
MustCheck Muss "Ja" oder "Nein" lauten |
|
Elementgröße ohne Puffergröße |
|
Puffergröße überschreitet Arraygröße |
|
Puffergröße auf Nichtzeiger |
|
Keine Eigenschaften für Attribut |
|
Zulässige Größe für nicht lesbaren Puffer |
|
Schreibbare Größe für Puffer, der nicht geschrieben werden kann |
|
Ungültige Anmerkung: Der Wert der 'NeedsRelease'-Eigenschaft muss "Ja" oder "Nein" lauten |
|
Ungültige Größe der Zeichenfolgendereferenzierung |
|
Ungültige Größe des Zeichenfolgentyps |
|
Ungültiger Größe des Zeichenfolgenparameters |
|
Ungültiger Größenzeichenfolgenstandort |
|
Ungültige Größe des Zeichenfolgenpuffertyps |
|
Ungültige Anmerkung: Die "NeedsRelease"-Eigenschaft darf nicht für Werte vom Typ "void" verwendet werden |
|
Unbekannter Formatzeichenfolgenstil |
|
Bei Verwendung von Attributanmerkungen für diese Funktion werden alle vorhandenen, zugehörigen __declspec-Anmerkungen ungültig |
|
Ungültige Größenangabe: Ausdruck nicht analysierbar |
|
Ungültiger Deref= oder Notref=: Ausdruck nicht analysierbar |
|
Der Wert ist kein gültiger Ja-/Nein-/Vielleichtwert |
|
Der Wert ist kein Zeichenfolgenwert |
|
Der Wert ist keine Zahl |
|
Unerwarteter Anmerkungsausdruckfehler |
|
Die erwartete Anzahl an Argumenten für die Anmerkung entspricht nicht der tatsächlichen Anzahl von Argumenten für die Anmerkung |
|
Unerwarteter Anmerkungsfehler für Anmerkung |
|
Der mit einer Anmerkung zu versehende Parameter muss ein Zeiger sein. |
|
Dereferenzierender NULL-Zeiger. Der Zeiger enthält denselben NULL-Wert wie ein anderer Zeiger. |
|
Illegaler Verweis auf nicht statischen Member. |
|
Mehrdeutiger Verweis auf Klassenmember. |
|
_Success_ oder _On_failure_ wurde in einem illegalen Kontext verwendet. |
|
Linker Operand zeigt auf eine Struktur, verwenden Sie '->' |
|
Linker Operand ist eine Struktur, verwenden Sie '.' |
|
Anmerkungen für den _on_failure_-Kontext dürfen sich nicht im expliziten Vorkontext befinden |
|
Statischer Kontextname für SAL_context erwartet |
|
Zeigerausdruck für Anmerkung erwartet |
|
Die _Use_decl_annotations_-Anmerkung muss ohne Änderung zum Verweisen auf eine vorherige Deklaration verwendet werden. |
|
Attributparameternamen müssen p1...p9 sein. |
|
Der Typefix kann nicht auf einen Parameter angewendet werden, der bereits über einen Typefix verfügt |
|
Die checkReturn-Anmerkung gilt nur für Nachbedingungen für den jeweiligen Funktionsparameter. |
|
Bei der Funktion stimmt die Anzahl der Parameter für die Anmerkung nicht mit der in der Datei gefundenen Anzahl überein |
|
Bei dem Funktionsparameter stimmt der Anmerkungsparameter nicht mit dem in der Datei gefundenen überein |
|
Member der Enumeration für Anmerkung des Parameters in der Anmerkung erwartet |
|
Ganzzahlausdruck für Anmerkung des Parameters in der Anmerkung erwartet |
|
Zeichenfolgenausdruck für den Parameter in der Anmerkung erwartet |
|
__yes, __no oder __maybe für die Anmerkung erwartet. |
|
Erwarterter Token/Bezeichner für Anmerkung, Parameter nicht gefunden |
|
Anmerkung erfordert Parameter |
|
In der Anmerkung wurde nicht die richtige Anzahl an Parametern gefunden |
|
Anmerkung kann nicht zusätzlich ein PrimOp sein (in der aktuellen Deklaration). |
|
Anmerkung kann nicht zusätzlich ein PrimOp sein (siehe vorherige Deklaration). |
|
Anmerkungsparamater: Typ kann nicht in Anmerkungen verwendet werden. |
|
Anmerkung unterstützt keine Parameter. |
|
Der Paramatertyp verfügt über keinen Member. |
|
Anmerkung ist nur im Array gültig. |
|
pre, post oder deref wurden auf keine Anmerkung angewendet |
|
pre, post oder deref wurden auf einen Block angewendet |
|
__at-Ausdruck gilt nicht für die aktuelle Funktion |
|
Die Funktion kann nicht als Anmerkung alleine stehen. |
|
Die Anmerkung kann nicht in einem Ausdruck verwendet werden |
|
Die Anmerkung für den Parameter wird nicht mehr unterstützt |
|
Die Anmerkung für den Parameter verfügt über mehrere Werte vom Typ 'value', 'stringValue' und 'longValue'. Verwenden Sie paramn=xxx |
|
Die Anmerkung für den Parameter verfügt über 'value', 'stringValue' oder 'longValue' sowie 'paramn=xxx'. Verwenden Sie nur paramn=xxx |
|
Die Anmerkung für den Parameter verfügt über 'param2', jedoch nicht über 'param1' |
|
Die Anmerkung für die Funktion des Parameters wird nicht erkannt |
|
Die Anmerkung für die Funktion des Parameters erfordert mehr Dereferenzierungen als der tatsächliche mit Anmerkungen versehene Typ zulässt |
|
Die Anmerkung für die Funktion merkt 'this' in einer Nicht-Member-Funktion an |
|
Die Parameteranmerkung für die Funktion stimmt nicht mit dem Typ des Parameters überein |
|
Inkonsistente Anmerkung für die Funktion: die vorherige Instanz weist einen Fehler auf. |
|
Inkonsistente Anmerkung für die Funktion: diese Instanz weist einen Fehler auf. |
|
Inkonsistente Anmerkung für die Funktion: der Parameter verfügt in dieser Instanz über andere Anmerkungen. |
|
Inkonsistente Anmerkung für die Funktion: der Parameter verfügt in dieser Instanz über andere Anmerkungen. |
|
dynamic_cast<>() wird in Anmerkungen nicht unterstützt |
|
Ein Syntaxfehler in der Anmerkung wurde in der Funktion für die Anmerkung gefunden: |
|
Ein Syntaxfehler in einer bedingten Anmerkung wurde für die Systeminterne Anmerkung gefunden |
|
Ergebnislistenwerte müssen Konstanten sein. |
|
Ein Syntaxfehler in der Anmerkung wurde in der Anmerkung der Funktion gefunden. |
|
Die Anmerkung für die Funktion, Parameter beim Untersuchen ist inkonsistent mit der Funktionsdeklaration |
|
Für die Funktion sind die Hinweise inkonsistent mit der Funktionsdeklaration |
|
Der Parameter zu _Macro_value_ ist NULL. |
|
Für das Symbol wurde ein 'begin' ohne zugehöriges 'end' gefunden |
|
Für das Symbol wurde ein 'end' ohne zugehöriges 'begin' gefunden |
|
Formatzeichenfolgen müssen sich in Vorbedingungen befinden |
|
Syntaxfehler im Parameter der Funktion |
|
Syntaxfehler am Ende der Funktion |
|
Syntaxfehler in _At_()-Anmerkung (unbekannter Parametername) für Funktion |
|
Syntaxfehler in _At_()-Anmerkung (ungültiger Parametername) für Funktion |
|
Für Funktion ReadableTo oder WritableTo enthielt keine Begrenzungsangabe als Parameter |
|
Die Anmerkung für die Funktion enthält mehr Externe als die tatsächliche Anzahl von Parametern |
|
post null/notnull auf deref-Ebene 0 ist ohne Bedeutung für die Funktion. |
|
Ausdrucksoperanden von inkompatiblen Typen für Operator |
|
Keine Anmerkungen für die erste Deklaration der Funktion. |
|
Ein zusätzlicher _Deref_-Operator wurde in der Anmerkung gefunden. |
|
Ein mehrdeutiger _Deref_-Operator wurde in der Anmerkung gefunden. |
|
Ein falsch platzierter _Notref_-Operator wurde auf den Token angewendet. |
|
Beim Analysieren eines Tokens wurde ein Fehler entdeckt. |
|
Die Anmerkung beschreibt eine Situation, die nicht bedingt anwendbar ist. |
|
Die Anmerkung beschreibt, wo ein dynamischer Wert (eine Variable) in der Bedingung nicht verwendet werden darf. |