Sowohl CppDepend als auch SonarQube sind statische Analysewerkzeuge, die ein regelbasiertes System zur Erkennung von Problemen in C/C++-Code bieten. Der standardmäßige Regelsatz von CppDependweist jedoch nur sehr wenige Überschneidungen aufmit den SonarQube-Regeln.
Grundsätzlich eignen sich SonarQube-Regeln gut dazu, Vorgänge innerhalb einer Methode – also den Codefluss – zu analysieren. Das CppDepend-Codemodell, auf dem die CppDepend-Regeln basieren, ist dagegen für eine 360°-Sicht auf übergeordnete Aspekte wie OOP, Abhängigkeiten, Metriken, Breaking Changes, Veränderlichkeit und Namensgebung optimiert.
Konkret können SonarQube-Regeln beispielsweise vor einer Referenz warnen, die null sein könnte. CppDepend kann hingegen auf übermäßig komplexe Klassen oder Komponenten hinweisen und Empfehlungen geben, wie sich der Code durch Refactoring sauberer und wartbarer gestalten lässt. Ein weiterer Punkt, der das Regelsystem von CppDepend einzigartig macht, istwie einfach sich benutzerdefinierte Regeln schreiben lassen. In CppDepend ist eine Regel eine LINQ-Abfrage auf einem speziell für Codequalität ausgelegten Codemodell. Sie wird direkt in Visual Studio bearbeitet und während der Bearbeitung unmittelbar kompiliert und ausgeführt. Konkret ist das folgende Codefragment bereits eine vollständig funktionsfähige Regel – könnte es einfacher sein?
// <Name>Klassen müssen mit einem I beginnen</Name>
warnif count > 0
Anwendung.Types.Where(t => t.IsClass && !t.SimpleName.StartsWith("C"))
Beim Definieren einer benutzerdefinierten Regel mit CppDepend müssen Sie weder ein Projekt oder eine Quelldatei anlegen noch den üblichen Bearbeiten-/Kompilieren-/Debuggen-Zyklus durchlaufen oder eine binäre DLL pflegen, deren Verteilung, Versionierung und Integration zusätzlichen Aufwand verursacht. In CppDepend bestehen benutzerdefinierte Regeln aus reinem Text, der als XML-CDATA in die CppDepend-Projekt- oder Regeldateien eingebettet wird. Auch Dokumentation und Hinweise zur Behebung können als Kommentare direkt im Regelquelltext hinterlegt werden.

Außerdem kann jede CppDepend-Regel ihre Issues mit zusätzlichen Daten darstellen, die dabei helfen, das Problem zu verstehen und zu beheben. Darüber hinaus kann jede Regel zwei Formeln enthalten, mit denen sowohl dieKosten für die Behebung des Issuesals auch diejährlichen Kosten eines nicht behobenen Issues, also called the technische Schuldenals auch diejährliche Zinsendes Issues bezeichnet.Da diese Formeln auf den Faktoren beruhen, die bei der Behebung eines Issues tatsächlich relevant sind, liefern sie aussagekräftigere Schätzungen der technischen Schulden.
Schließlich wird jede CppDepend-Regel selbst bei einer großen Codebasis innerhalb weniger Millisekunden ausgeführt. Dadurch lassen sich sämtliche Regeln in wenigen Sekunden ausführen – bei einer realen Codebasis typischerweise in 2 bis 3 Sekunden –, sowohl in Visual Studio als auch im Continuous-Integration-System. Nach jeder Kompilierung und beim Check-in sieht der Entwickler dadurch sofort, welche Issues seit der Baseline neu hinzugekommen oder behoben worden sind und welche technischen Schulden dadurch beseitigt oder neu eingeführt wurden. Im Folgenden zeigen wir, wie sich die Ergebnisse der CppDepend-Regeln in SonarQube integrieren lassen, um die Stärken beider Produkte zu kombinieren.
I – Voraussetzungen für das C/C++-Plugin
- Installieren SieSonarQube.
- Installieren SieSonarQube Scanneroder den altenSonar Runner.
- Fügen Sie das bin-Verzeichnis von SonarQube Scanner bzw. SonarRunner zur Umgebungsvariablen PATH hinzu.
II – Installation und Konfiguration des Plugins
- Kopieren Sie sonar-cxx-plugin-cppdepend-1.0 aus $CppDependInstallDir$/SonarPlugin in das Verzeichnis $SonarQubeInstallDir$\extensions\plugins und starten Sie SonarQube neu.
- Die standardmäßigen CppDepend-Regeln werden in das SonarQube-Regel-Repository geladen. Wenn Sie diese Regeln anpassen möchten, können Sie über den Pfad zur .cdproj-Datei im SonarQube-Administrationsbereich eigene Regeln definieren.

- Melden Sie sich als Administrator an und aktivieren Sie die CppDepend-Regeln im gewünschten Profil.

- Führen Sie $CppDependInstallDir$/SonarRunnerForCppDepend.exe "die zu analysierende .cdproj-Datei" aus. Zum Beispiel:SonarRunnerForCppDepend.exe C:\MyWorkspace\test.cdproj. SonarRunnerForCppDepend analysiert die cdproj-Datei mit CppDepend und startet anschließend den SonarQube Scanner, um die Ergebnisse in SonarQube zu laden. Alle weiteren Argumente, die nach dem cdproj-Dateiargument an SonarRunnerForCppDepend übergeben werden, werden an den SonarScanner-Befehl weitergereicht. Beispielsweise können Sie die Version mit folgendem Befehl angeben:SonarRunnerForCppDepend.exe C:\MyWorkspace\test.cdproj -Dsonar.projectVersion=3.0
III – Funktionen des Plugins
- Multi-Modul-Analyse:Ein CppDepend-Projekt kann zahlreiche C/C++-Projekte enthalten. Nach der Analyse legt CppDepend nicht den gesamten Code im selben SonarQube-Modul ab, sondern erstellt ein SonarQube-Projekt mit mehreren Modulen. Jedes Projekt wird dabei in einem eigenen Modul isoliert, wodurch die Navigation im Code erheblich erleichtert wird.

- Issues:CppDepend stellt standardmäßig mehr als 250 Regeln bereit, die sich vollständig und einfach anpassen lassen. Darüber hinaus bietet CppDepend eine leistungsfähige Möglichkeit, dietechnischen Schulden zu berechnenvon Issues. Die von CppDepend ermittelten technischen Schulden und der Schweregrad der Issues werden an SonarQube übergeben.

- Standardmetriken:Das Plugin berechnet sämtliche Standardmetriken von SonarQube.

- Code-Duplizierung:Duplikate werden vom in SonarQube integrierten CPD-Tool erkannt.

- Codeabdeckung:Das Plugin lädt Ergebnisse zur Codeabdeckung aus XML-Ergebnisdateien von Cobertura und Microsoft Visual Studio. Dazu müssen Sie jedoch den Pfad zu den XML-Coverage-Dateien angeben.


Fazit
Das C/C++-SonarQube-Plugin lässt sich einfach installieren und verwenden; auch die Anpassung der Regeln ist unkompliziert. Sie können esausprobierenund uns Ihr Feedback mitteilen.
