Analysieren der Qualität des C++-Codes von Store-Apps mit der statischen Codeanalyse von Visual Studio
Das Codeanalysetool in Visual Studio Express-Editionen überprüft den Code auf eine Reihe von allgemeinen Fehlern und auf Verstöße gegen gebräuchliche Programmiergrundlagen. Codeanalysewarnungen unterscheiden sich von 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, Visual Studio Premium und Visual Studio Professional können Sie sämtliche Funktionen der Codeanalysetools verwenden.Weitere Informationen finden Sie unter 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++ auf Build 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, zeigt die Codeanalyse die Zeilennummer und die Analyselogik an, die zu der Warnung geführt haben.
Wenn Sie eine Warnung erweitern, werden die Codezeilen, die die Warnung verursacht haben, im Visual Studio-Code-Editor hervorgehoben.
Nachdem Sie das Problem 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.Klicken Sie auf die Schaltfläche Analysieren, und wählen Sie dann 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.
Durch das Unterdrücken einer Meldung wird #pragma(warning:WarningId) eingefügt, das die Warnung für die Codezeile unterdrückt.
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 gibt 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-Ganzzahlargument für Formatfunktion |
|
Nicht-Zeichenargument für Formatfunktion |
|
Ungültige Zeichenfolgenumwandlung |
|
Ungültiger CreateProcess-Aufruf |
|
Ungültiges Objekt-Argument 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ültiges Zeichenfolgenargument für breite Zeichen zu Formatfunktion |
|
Keine Übereinstimmung bei Größe und Count-Verwendung |
|
Falscher Variablenargument-Funktionsaufruf |
|
Möglicher Argumenttypenkonflikt |
|
Leseüberlauf |
|
Schreibüberlauf |
|
Ungültiger Parameterwert |
|
Ungültige Attributeigenschaft |
|
In Konflikt stehende Attributeigenschaftswerte |
|
Verweise dürfen nicht NULL sein. |
|
NULL auf Nichtzeiger |
|
MustCheck für "void" |
|
Puffergröße auf Nichtzeiger oder Array |
|
NULL-Konflikt bei 0 Dereferenzierung |
|
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 übersteigt 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: Wert für die Eigenschaft "NeedsRelease" muss "Ja" oder "Nein" sein |
|
Ungültige Größenzeichenfolgendereferenzierung |
|
Ungültiger Größenzeichenfolgentyp |
|
Ungültiger Größenzeichenfolgenparameter |
|
Ungültiger Größenzeichenfolgenstandort |
|
Ungültiger Größenzeichenfolgen-Puffertyp |
|
Ungültige Anmerkung: Die 'NeedsRelease'-Eigenschaft kann nicht für Werte des void-Typs 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 Yes/No/Maybe-Wert |
|
Der Wert ist kein Zeichenfolgenwert |
|
Der Wert ist keine Zahl |
|
Unerwarteter Ausdrucksfehler der Anmerkung |
|
Erwartete Anzahl von Argumenten für die Anmerkung stimmt nicht mit tatsächlicher Anzahl von Argumenten für die Anmerkung überein |
|
Unerwarteter Anmerkungsfehler für Anmerkung |
|
Der mit einer Anmerkung zu versehende Parameter muss ein Zeiger sein. |
|
Dereferenzierender NULL-Zeiger. Der Zeit enthält denselben NULL-Wert wie ein anderer Zeiger. |
|
Illegaler Verweis auf nicht statischen Member |
|
Mehrdeutiger Verweis auf Klassenmember. |
|
_Success_ or _On_failure_ wurde in einem illegalen Kontext verwendet. |
|
'->' verwenden, wenn linker Operand auf eine Struktur zeigt |
|
'.' verwenden, wenn linker Operand eine Struktur ist |
|
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 bestimmten Funktionsparameter. |
|
Für die Funktion stimmt die Anzahl der Parameter für die Anmerkung nicht mit der in der Datei gefundenen überein |
|
Für den Funktionsparameter stimmt der Parameter der Anwendung nicht mit dem in der Datei gefundenen überein |
|
Member von Enumeration für den Parameter in der Anmerkung erwartet |
|
Für den Parameter in der Anmerkung erwarteter Ganzzahlausdruck |
|
Für den Parameter in der Anmerkung erwarteter Zeichenfolgeausdruck |
|
__yes, __no oder __maybe für die Anmerkung erwartet |
|
Erwartetes Token/Bezeichner für Anmerkung, Parameter nicht gefunden |
|
Anmerkung erfordert Parameter |
|
Korrekte Anzahl erforderlicher Parameter konnten in Anmerkung nicht gefunden werden |
|
Anmerkung kann nicht zusätzlich ein PrimOp sein (in der aktuellen Deklaration). |
|
Anmerkung kann nicht zusätzlich ein PrimOp sein (siehe vorherige Deklaration). |
|
Anmerkungsparameter: Typ kann nicht in Anmerkungen verwendet werden. |
|
Anmerkung unterstützt keine Parameter. |
|
Der Parametertyp weist keinen Member auf. |
|
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 zum Parameter wird nicht mehr unterstützt. |
|
Die Anmerkung zum Parameter verfügt über mehrere Werte vom Typ "value", "stringValue" und "longValue". Verwenden Sie paramn=xxx. |
|
Für die Anmerkung zum Parameter wurden sowohl value, stringValue oder longValue sowie paramn=xxx definiert. Verwenden Sie nur paramn=xxx. |
|
Die Anmerkung zum Parameter verfügt über param2, jedoch nicht über param1. |
|
Die Anmerkung für die Funktion zum Parameter wird nicht erkannt. |
|
Die Anmerkung für die Funktion zum Parameter erfordert eine größere Anzahl von Dereferenzierungen, als der derzeit angemerkte 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 Parametertyp ü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 weist andere Anmerkungen für diese Instanz auf. |
|
Inkonsistente Anmerkung für die Funktion: der Parameter weist andere Anmerkungen für diese Instanz auf. |
|
dynamic_cast<>() wird in Anmerkungen nicht unterstützt. |
|
Ein Syntaxfehler in der Anmerkung wurde in der Funktion für Anmerkung gefunden |
|
Ein Syntaxfehler in einer bedingten Anmerkung wurde gefunden für systeminterne Anmerkung |
|
Ergebnislistenwerte müssen Konstanten sein. |
|
Ein Syntaxfehler in den Anmerkungen wurde in Anmerkung in der Funktion gefunden. |
|
Die Anmerkung für Funktion, Parameter, beim Untersuchen von ist inkonsistent mit der Funktionsdeklaration. |
|
Für Funktion sind die Hinweise inkonsistent mit der Funktionsdeklaration. |
|
Der Parameter für _Macro_value_ ist Null |
|
Für Symbol wurde ein 'begin' ohne zugehöriges 'end' gefunden. |
|
Für Symbol wurde ein 'end' ohne zugehöriges 'begin' gefunden. |
|
Formatzeichenfolgen müssen sich in Vorbedingungen befinden |
|
Syntaxfehler im Parameter für Funktion |
|
Für Funktion wurde ein Syntaxfehler gegen Ende gefunden. |
|
Für Funktion Syntaxfehler in _At_()-Anmerkung (unbekannter Parametername) |
|
Für Funktion Syntaxfehler in _At_()-Anmerkung (ungültiger Parametername) |
|
Für Funktion: ReadableTo oder WritableTo enthielt keine Begrenzungsangabe als Parameter. |
|
Die Anmerkung für Funktion enthält mehr Externe als die tatsächliche Anzahl von Parametern. |
|
Post null/notnull auf deref-Ebene 0 ist ohne Bedeutung für 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 gefunden, der auf das Token angewendet wird. |
|
Fehler beim Analysieren eines Token. |
|
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. |