Bei der statischen Codeanalyse wird der Quellcode von Software auf Schwachstellen untersucht. Tools zur statischen Analyse helfen dabei, häufige Programmierfehler zu erkennen. Zu ihren Vorteilen gehören unter anderem:
- Den Quellcode lesbarer und wartbarer machen.
- Unerwartetes Verhalten zur Laufzeit verhindern.
- Die Ausführungsleistung verbessern.
- Den Code sicherer machen.
Es gibt zahlreiche Tools zur statischen Analyse von C/C++, die jeweils unterschiedliche Schwerpunkte setzen und eigene Vorteile bieten. Beispiele sind:
- CppCheck
- Clang Analyzer
- Visual C++ Analyzer
- VERA++
- Goanna
- Viva64
- PCLint
Die Ergebnisse dieser Tools lassen sich auf verschiedene Weise auswerten:
- XML-Format: Jedes dieser Tools kann XML-Dateien erzeugen. Daraus lässt sich ein HTML-Bericht erstellen, oder die Dateien können von einem anderen Tool zur Auswertung der Analyseergebnisse verarbeitet werden.
- HTML-Format: HTML eignet sich gut zum Erstellen von Berichten und zum Teilen der Ergebnisse im Team. Mit einem XSL-Stylesheet lassen sich außerdem individuelle Berichte erzeugen.
- IDE-Plugins: Für nahezu alle bekannten IDEs gibt es Plugins für diese Tools, sodass Verstöße direkt im Quellcode angezeigt werden können.
Ein Problem vieler Code-Quality-Tools besteht darin, dass sie Entwickler mit vermeintlichen Problemen überhäufen, die in Wirklichkeit keine sind – sogenannten False Positives. Treten solche Fehlalarme häufig auf, beginnen Entwickler die Ausgaben des Tools zu ignorieren oder verzichten schließlich ganz darauf.
Um die Ergebnisse besser auszuwerten, ist es daher hilfreich, sich gezielt auf relevante Befunde konzentrieren zu können und Entwicklern eine übersichtliche Darstellung zu bieten.
CppDepend und CQLinq
CppDepend ist ein weiteres Tool zur statischen Analyse, das die anderen Lösungen ergänzt. Es verwendet eine auf LINQ basierende Code-Abfragesprache (CQLinq), mit der sich die Codebasis ähnlich wie eine Datenbank abfragen lässt.
CppDepend integriert standardmäßig Cppcheck, Vera++ und den Clang Analyzer und lässt sich über seine API problemlos um weitere Tools zur statischen Analyse erweitern. Der Quellcode des Visual-Studio-Analyzer-Plugins zeigt beispielhaft, wie andere Tools integriert werden können.
Nehmen wir den Clang-Quellcode als Beispiel und sehen wir uns an, wie sich die Ergebnisse dieser Tools mit CppDepend untersuchen lassen.
Alle Issues abrufen:
Die Abfrage zum Abrufen aller Issues ist sehr einfach. Wie man jedoch sieht, ist das Ergebnis wenig hilfreich: Mit 331.417 Issues zu arbeiten, ist eine erhebliche Herausforderung.

Um die Ergebnisse besser handhaben zu können, lassen sie sich filtern, sodass wir uns nur auf die relevanten Informationen konzentrieren.
Abfragen nach Tool
Wir können die erste Abfrage ändern und ein Kriterium für das gewünschte Tool hinzufügen.

Am häufigsten gemeldete Issues
Es ist hilfreich zu wissen, welche Issues von diesen Tools am häufigsten gemeldet werden.
Am häufigsten treten die von Vera++ gemeldeten Stilprobleme auf. Falls diese im jeweiligen Projekt nicht relevant sind, können wir sie aus der Abfrage ausschließen.
Klassen mit den meisten Issues
Es ist besonders interessant zu wissen, welche Klassen viele Verstöße enthalten.

Die vorherige Abfrage ist aufschlussreich, zeigt aber nicht genau, welche Klassen die gravierendsten Qualitätsprobleme aufweisen. Eine weitere nützliche Kennzahl ist NBLinesOfCode. Wir können die vorherige Abfrage anpassen und das Verhältnis zwischen der Anzahl der Issues und NBLinesOfCode berechnen.

Am häufigsten verwendete Methoden mit Issues
Wenn Tools zur statischen Analyse Issues melden, ist es wichtig zu wissen, welche davon priorisiert werden sollten – insbesondere bei möglichen Bugs. Ein Fehler kann in einer bestimmten Methode liegen; entscheidend ist jedoch auch, wie viel anderer Code davon betroffen ist. Häufig verwendete Methoden werden von mehr Code aufgerufen, daher sollten ihre Probleme möglichst schnell behoben werden.

Mit CQLinq können wir die Ergebnisse all dieser Tools sowie die Ergebnisse von CppDepend kombinieren, komplexere Abfragen erstellen und diese Prüfungen in den Build-Prozess integrieren.
Issue-Trends
Issues sind in Softwareprojekten nichts Ungewöhnliches; jedes Projekt kann Probleme enthalten, die behoben werden müssen. Wichtig ist jedoch, die Entwicklung der Projektqualität zu beobachten. Steigt die Anzahl der Issues mit der Weiterentwicklung des Projekts kontinuierlich an, ist das ein schlechtes Zeichen. CppDepend bietet mit Trend Monitoring eine Funktion zum Erstellen entsprechender Trenddiagramme.
Trenddiagramme basieren auf Metrikwerten, die bei den Analysen über einen längeren Zeitraum aufgezeichnet werden. Standardmäßig stehen mehr als 50 Trendmetriken zur Verfügung; eigene Trendmetriken lassen sich ebenfalls einfach erstellen.
Mit diesem Trenddiagramm können wir verfolgen, wie sich die Cppcheck-Issues im Laufe der Zeit entwickeln:

Ergebnisse statischer Analysetools in den HTML-Bericht integrieren
CppDepend ermöglicht es, dem HTML-Bericht zusätzliche Abschnitte hinzuzufügen, in denen ausgewählte CQLinq-Abfragen aufgeführt werden.
Im Bereich CQLinq Query Explorer wird eine bestimmte als Bericht markierte CQLinq-Gruppe mit einem orangefarbenen Rahmen hervorgehoben.

Im HTML-Bericht sind diese zusätzlichen Abschnitte anschließend über das Menü erreichbar:

Ergebnisse statischer Analysetools in den Build-Prozess integrieren
CppDepend verfügt über das Konzept der Critical CQLinq Rule. Mit kritischen Regeln lassen sich Regeln hoher Priorität definieren, die niemals verletzt werden dürfen. Wird eine solche Regel verletzt, kann der Build-Prozess automatisch abgebrochen werden.
Eine kritische Regel ist einfach eine CQLinq-Regel, bei der die Option Critical Rule aktiviert ist:

Wird während des Build-Prozesses eine kritische Regel verletzt, gibt CppDepend.Console.exe einen Exit-Code ungleich null zurück. Dieses Verhalten kann genutzt werden, um den Build-Prozess bei einer Verletzung einer kritischen Regel abzubrechen.
So lässt sich beispielsweise problemlos eine kritische Cppcheck-Regel definieren, die den Build abbricht, sobald bestimmte Arten von Cppcheck-Issues gefunden werden.
Fazit
CppDepend ist offen für weitere Tools zur statischen Analyse, und auch eigene Tools lassen sich problemlos integrieren. Dadurch können Sie sämtliche Funktionen von CppDepend nutzen, um die Ergebnisse unterstützter C/C++-Analysetools gezielter und effizienter auszuwerten.
