Was ist Code-Analyse?

Wahrscheinlich weiß jeder, der an der Softwareentwicklung beteiligt ist, wie wichtig die Codequalität ist. Sie wirkt sich darauf aus, wie einfach es ist, den Code zu pflegen, ihn zu verstehen und neue Funktionen hinzuzufügen, und natürlich hat die Codequalität einen erheblichen Einfluss auf die Softwarequalität. Da fast jeder Entwickler seine eigene Meinung darüber hat, was Codequalität bedeutet, kann die Frage „Was ist Softwarequalität?“ zu hitzigen Debatten führen. Trotzdem gibt es einige allgemein anerkannte Standards, an die sich die meisten Entwickler zu halten versuchen, z. B. wie klar, einfach und elegant Ihr Code ist (so dass jemand, der nicht der Autor ist, ihn pflegen und verstehen kann), wie leicht der Code erweitert werden kann, seine Leistung und so weiter. Eine der Möglichkeiten, gute Qualität zu erreichen, ist die Verwendung von Code-Analysatoren. Worum geht es also bei all diesen Analysatoren?

Eigentlich spricht der Name für sich selbst; solche Tools werden verwendet, um den Code zu untersuchen und Informationen über seine Qualität zu melden, z. B. ob Verstöße gegen die Programmier- und Designregeln gefunden wurden, Daten über die Codekomplexität usw. Die Quellcode-Analyse kann sowohl statisch als auch dynamisch sein. Die statische Analyse wird durchgeführt, ohne dass der Code tatsächlich ausgeführt wird. Diese Art von Software scannt den gesamten Code eines Projekts, um Schwachstellen zu finden, validiert ihn anhand von Best Practices der Branche und bietet auch die Möglichkeit, ihn anhand der Codierungsregeln des Unternehmens zu validieren usw. Eine solche Analyse kann auch als Teil einer Codeüberprüfung durchgeführt werden. Nach der statischen Analyse kann eine dynamische verwendet werden, um subtilere Fehler aufzudecken. Sie verwendet den umgekehrten Ansatz und bedeutet eine Analyse auf der Grundlage der Ausführung. Der häufigste Ansatz ist die Ausführung von Unit-Tests.

Die Kombination dieser beiden Analysetypen sollte helfen, nahezu 95 % der Fehler zu finden, vorausgesetzt, die Analyse wird von einer Person durchgeführt, die den Quellcode versteht. Beide haben jedoch ihre eigenen Schwachstellen. So haben Code-Analysatoren beispielsweise kein Verständnis für die Absicht des Code-Autors und können falsch-positive Ergebnisse (eine mögliche Schwachstelle, die in Wirklichkeit nicht existiert) oder falsch-negative Ergebnisse (umgekehrt, wenn eine Schwachstelle existiert, aber das Tool nicht darüber berichtet) melden. Es kann weder die vollständige Testabdeckung des Quellcodes garantieren noch die Korrektheit einer Code-Operation überprüfen (d.h. es kann nicht sicherstellen, dass Ihr Code so funktioniert, wie Ihr Kunde es erwartet).

Als .NET-Entwicklungsunternehmen haben wir viel Erfahrung mit verschiedenen Tools zur Verbesserung des Codes. In diesem Artikel werden wir uns auf statische Code-Analysatoren konzentrieren und auch NDepend, ein statisches Analysetool für verwalteten .NET-Code, betrachten.

Auswahl eines statischen Analyzers

Nehmen wir an, Sie entscheiden sich für den Einsatz eines statischen Analysetools. Die Wahl des geeigneten Tools ist immer ein individueller Prozess. Einige Entwickler verwenden statische Analysetools, die in ihre IDE integriert sind, andere bevorzugen Lösungen von Drittanbietern. Hier sind ein paar allgemeine Dinge, die Sie bei der Entscheidung für das richtige Tool berücksichtigen sollten:

  1. Suchen Sie zunächst nur solche Tools, die die von Ihnen gewählte Programmiersprache und IDE unterstützen.
  2. Zögern Sie nicht, sich die Bewertungen dieser Tools anzusehen und sie ein wenig auszuprobieren – auf diese Weise können Sie sicherstellen, dass die gewählte Lösung so gut ist, wie Sie sie brauchen.
  3. Prüfen Sie, ob das Tool die Möglichkeit bietet, zusätzliche Regeln zu definieren, um die internen Kodierungsrichtlinien durchsetzen zu können.
  4. Schauen Sie sich das Preismodell des jeweiligen Tools an.
  5. Überlegen Sie, was Sie von dem Tool benötigen, und schließen Sie diejenigen aus, die diese Funktionen nicht bieten. Einige Tools konzentrieren sich beispielsweise nur auf die Codequalität. Wenn Sie also auch die Sicherheit überprüfen wollen, sind sie offensichtlich nicht die richtige Wahl.
  6. Wie aktiv das Tool aktualisiert wird. Es treten ständig neue Probleme auf, und Sie müssen sicher sein, dass die Autoren des ausgewählten Tools es regelmäßig aktualisieren.

Denken Sie daran, dass die ausschließliche Verwendung von statischen Analysetools kein Ausweg ist. In erster Linie können starke Prozesse die Anwendungssicherheit und Codequalität von Anfang an gewährleisten. Außerdem brauchen Sie jemanden, der die Ergebnisse der Analyse überprüft und entscheidet, was zu tun ist, wenn Probleme gefunden werden.

Redwerk bietet einen kompletten Entwicklungszyklus vom ersten Konzept bis zur produktiven Lösung, und wir achten sehr auf die Qualität des Codes. Deshalb haben wir, als wir von Patrick Smacchia, dem Hauptentwickler von NDepend, die Anfrage erhielten, sein Tool zu testen, diesem Vorschlag zugestimmt und beschlossen, auch einen Überblick über dieses Tool zu geben. Zum Zeitpunkt der Erstellung dieses Artikels war die Version von NDepend 1.9.

.NET Managed Code Analyzer – NDepend

Das NDepend-Tool unterstützt eine große Anzahl von Code-Metriken, einschließlich Abhängigkeitsgraphen und Abhängigkeitsmatrix zur Untersuchung der Codestruktur. Wir werden das eigenständige UI-Programm NDepend Professional prüfen. Darüber hinaus bietet NDepend eine Reihe von Integrationsvarianten:

  1. Visual Studio-Erweiterung.
  2. Eine ausführbare Konsole, die verwendet wird, um eine Analyse mit NDepend durchzuführen und einen Bericht zu erstellen. Es nimmt Befehlszeilenargumente entgegen und der einzige obligatorische Parameter ist ein absoluter Pfad zur NDepend-Projektdatei, die die zu analysierende Codebasis definiert.
  3. PowerTools ist eine Reihe von kleinen Programmen, die auf NDepend.API basieren. Sie sind Open Source und dienen zur Demonstration der NDepend-API-Syntax und -Fähigkeiten.
  4. Azure DevOps und TFS-Erweiterung.
  5. NDepend TeamCity-Plugin.
  6. Es gibt keine derartige Integration mit Jenkins, Atlassian Bamboo und AppVeyor, wie es sie beispielsweise für Azure gibt, aber es ist möglich, sie über die NDepend.Console.exe zu integrieren.
  7. SonarQube-Integration.
  8. CruiseControl.NET-Integration.
  9. FinalBuilder-Integration.
  10. AddIn für Reflector.
  11. Sie können auch OpenCover, JetBrains DotCover oder NCover (3.X und höher) Abdeckungsergebnisdateien in ein NDepend-Projekt importieren.

Wie Sie sehen können, bietet NDepend eine breite Palette von Anwendungsmöglichkeiten. Sie bieten auch eine kostenlose Testversion mit einer Reihe von Funktionen der Professional Edition an. In diesem Artikel werden wir versuchen, eine Schritt-für-Schritt-Anleitung für die Arbeit mit NDepend zu geben und hoffen, dass dies den Lesern hilft, zu entscheiden, ob es für ihre aktuellen Projekte geeignet ist oder nicht. Wenn Sie der Meinung sind, dass Sie ein solches Werkzeug im Moment nicht benötigen, können Sie NDepend trotzdem testen, denn wenn Sie einen statischen Analysator benötigen, werden Sie die Suchzeit nach einem hilfreichen Werkzeug reduzieren.

Installationsprozess und erster Start

NDepend wird in Form einer .zip-Datei verteilt. Es ist eine kontroverse Frage, was besser ist: ein MSI-Installationsprogramm oder eine .zip-Datei. Beide Varianten haben Vor- und Nachteile und werden ihre Befürworter haben. Auf jeden Fall ist der Installationsprozess von NDepend aufgrund der aktuellen Distributionsvariante ziemlich einfach: Sie müssen die Dateien nur in einen Anwendungsordner auf Ihrem Rechner entpacken. Die einzige Bemerkung ist, dass es nicht empfohlen wird, Dateien in den Ordner „%ProgramFiles%\NDepend“ zu entpacken. Dies kann aufgrund des Windows-Schutzes zu Problemen führen. Beim ersten Start müssen Sie Ihren Lizenzschlüssel eingeben. Danach wird der Hauptbildschirm angezeigt, auf dem Sie die erforderliche Erweiterung (für Visual Studio, Azure DevOps usw.) installieren und ein Projekt zur Analyse erstellen können. Der folgende Screenshot veranschaulicht den Hauptbildschirm des Tools.
Ndepend tool - main screen
Die Oberfläche ist ziemlich einfach und erinnert an die Oberfläche von Visual Studio. Und das ist kein Zufall, denn die NDepend-Skins enthalten eine Reihe von Visual Studio-, MS Office- und DevExpress-Skins, darunter sogar die Option, den Menütext von Groß- auf Kleinschreibung umzustellen.

Da wir das eigenständige Programm überprüfen, müssen wir ein neues NDepend-Projekt erstellen. Für die Zwecke dieses Artikels werden wir unser Testprojekt verwenden, das als Beispiel für einen der vorherigen Artikel diente. Der Erstellungsprozess ist ziemlich standardmäßig und einfach: Sie müssen lediglich einen Projektnamen, den Speicherort und den Dateinamen angeben. Danach wird ein Projekteigenschaften-Panel angezeigt, in dem Sie die Baugruppen auswählen und die erforderlichen Analyseoptionen einstellen können.


Schauen wir uns diese Analyseoptionen nacheinander an, um einen allgemeinen Eindruck davon zu gewinnen, welche Optionen Sie einrichten können:

  1. Auf der Registerkarte “Zu analysierender Code” können Sie die zu analysierenden Assemblies auswählen. Dazu gehören sowohl Ihre eigenen Assemblies als auch Assemblies von Drittanbietern, die von Ihrer Anwendung verwendet werden (wie mscorlib.dll oder Log4Net.dll).
  2. Auf der Registerkarte “Analyse” können Sie bei Bedarf den Projektnamen und den Ausgabeordner ändern und außerdem einige Analyseoptionen konfigurieren. Sie können zum Beispiel die folgenden Optionen festlegen:
    • mit welchen früheren Analyseergebnissen die aktuell durchgeführte Analyse verglichen werden soll;
    • den Speicherort für die historischen Analyseergebnisse und die Häufigkeit der Speicherung festlegen;
    • die Häufigkeit der Protokollierung von Trendmetriken und den Ort, an dem sie gespeichert werden, festlegen. Diese Werte werden zum Zeitpunkt der Analyse protokolliert;
    • Festlegung der Abdeckungsdateien (NCover, dotCover, OpenCover oder VisualStudio XML), aus denen die Testabdeckungsstatistiken gesammelt werden sollen;
    • die Option Source File Rebasing setzen, die verwendet wird, wenn die Codekompilierung und die NDepend-Analyse auf einem anderen Rechner ausgeführt werden. Wenn diese Option aktiviert ist, werden die Informationen nicht nur aus den ausgewählten Assemblies, sondern auch aus den Quelldateien gesammelt, sofern diese verfügbar sind.
  3. Auf der Registerkarte “Issue and Debt” können Sie die Berechnung der technischen Schuld und die Ergebnisse einstellen. Die technische Schuld ist die geschätzte Arbeitszeit, die zur Behebung des Problems benötigt wird. Weitere Details zu dieser Option und den verfügbaren Einstellungen finden Sie in der entsprechenden NDepend-Dokumentation.
  4. Die Registerkarte “Report” ermöglicht die Anpassung der bereitgestellten Berichte (z.B. die Aktivierung oder Deaktivierung von Optionen wie die Vermeidung von zu großen Berichten für eine große Codebasis, das Ausblenden von Drittanbieter-Assemblies usw.).
  5. Die Registerkarte “Paths Referenced” zeigt alle Pfade an, die vom NDepend-Projekt referenziert werden, und hier können Sie die Umleitung von Pfaden verwalten. Hier können Sie die Umleitung von Pfaden verwalten. Außerdem finden Sie hier eine Erläuterung zu den Pfadarten, die verwendet werden können, und können die Pfadvariablen verwalten.

Nachdem wir das Set der verfügbaren Einstellungen durchgesehen haben, wollen wir uns nun den Funktionen von NDepend zuwenden. Klicken Sie auf „Add VS Solution or Project“, wählen Sie das Projekt aus, das Sie analysieren möchten, und klicken Sie auf die Schaltfläche „Run analysis on Current Project“ (oder drücken Sie F5). Die Analyse ist ziemlich schnell (wir haben es mit mehreren Projekten unterschiedlicher Größe ausprobiert) und nach der Analyse sehen Sie ein Dashboard mit den Ergebnissen, wie es unten gezeigt wird:

Oben finden Sie strukturierte Informationen zu den Analyseergebnissen, z. B. den Prozentsatz der Kommentare, die Anzahl der Codezeilen, die Anzahl der Fehler, Warnungen usw. Die Trenddiagramme, die unten auf dem Screenshot zu sehen sind, geben einen Überblick über die Veränderungen Ihrer Codequalität im Laufe der Zeit. Auf den ersten Blick mag dies nicht sehr informativ erscheinen, aber später, nach der Arbeit an Code-Verbesserungen, werden Sie die Fortschritte sehen.

Sie können auf die Werte in den Feldern „Regeln“, „Quality Gates“ und allen anderen Feldern klicken, um weitere Informationen zu erhalten. Zum Beispiel gibt es in unserem Testprojekt 1 verletzte Regel, und wenn Sie auf den Wert klicken, wird auf der rechten Seite eine kurze Information über die Probleme angezeigt. Wenn Sie mit der rechten Maustaste klicken und „Pin-Beschreibung in der Info-Ansicht“ wählen, erhalten Sie eine ausführliche Erläuterung, wie sie unten gezeigt wird:

Solche Erklärungen sind sehr informativ und enthalten sowohl die Beschreibung der Probleme als auch Links zu detaillierteren Informationen. Wenn Sie auf die Regel doppelklicken, sehen Sie, wo sich das Problem tatsächlich befindet. Ein Zähler auf der rechten Seite der Boxen zeigt die Anzahl der behobenen Probleme an (Sie finden sie auf dem Screenshot oben).

Abfrage der Code-Sprache

Unter dem „Dashboard“ befindet sich der „Abfrage- und Regel-Explorer“, einer der wichtigsten Bereiche für das Verständnis und die Anpassung Ihrer Analyse. Hier werden alle angewendeten Regeln angezeigt, und Sie können ganz einfach eine beliebige Regel aktivieren oder deaktivieren oder sogar eine neue Regel erstellen, je nachdem, was für Sie am besten geeignet ist. Alle Regeln sind in Code Language Query (CQL) geschrieben, deren Syntax der von LINQ ähnelt, so dass es keine Probleme beim Hinzufügen oder Bearbeiten von Regeln geben sollte, zumal der Editor über Syntaxhervorhebung, Codevervollständigung und Tooltip-Dokumentation verfügt.

Dies ist eine wirklich leistungsstarke und großartige Funktion von NDepend. Obwohl NDepend viele Standard-Codemetriken bereitstellt, würden sich viele Leute über die Möglichkeit freuen, ihre eigenen geschäftlichen oder persönlichen Regeln hinzuzufügen, die sie als „Must-have“ für die Qualitätskontrolle ansehen. Alle Änderungen werden in der .ndproj-Datei gespeichert, so dass bei einer gemeinsamen Nutzung, z. B. über die Versionskontrolle, das gesamte Team über die neuen Änderungen verfügt. Zu Beginn kann es eine Weile dauern, alle benötigten Regeln einzurichten, aber danach können Sie sicher sein, dass die Analyse zu 100 % für Ihr Projekt geeignet ist.

Alle vordefinierten Regeln sind mit Kommentaren versehen, die Ihnen eine ausführlichere Beschreibung liefern. Um eine solche Erklärung zu sehen, müssen Sie nur auf die Regel klicken, die Sie interessiert, und auf der linken Seite sehen Sie die CQL-Abfrage und eine Beschreibung.

Abhängigkeitsdiagramm

NDepend verfügt über eine weitere großartige Funktionalität – den Abhängigkeitsgraphen, der bei großen Projekten sehr hilfreich sein kann, wenn man versucht, die Struktur und die Abhängigkeiten zu verstehen. Die Größe jedes Knotens hängt direkt von der Anzahl der Codezeilen ab, die er enthält, aber dieser Parameter kann leicht im Fenster umgeschaltet werden. Das Diagramm ist farbig, was die visuelle Unterscheidung zwischen abhängigen (in blau) und abhängigen (in grün) Baugruppen erleichtert. Jeder Knoten ist navigierbar, so dass Sie Ihren Quellcode öffnen können, indem Sie einfach auf den gewünschten Knoten klicken.

Abhängigkeitsmatrix

Wie Sie sehen können, ist das Diagramm für ein kleines Projekt recht verständlich und kleinformatig. Bei großen Projekten ist die Situation ganz anders – das Diagramm ist riesig und ziemlich verwirrend, und es ist unbestreitbar schwierig, eine komplexe große Projektstruktur in einem kleinen, klaren Diagramm darzustellen. Zum Durchsuchen großer Strukturen eignet sich die Abhängigkeitsmatrix besser.

Die Matrix zeigt auch die Abhängigkeiten zwischen Baugruppen und ihren Mitgliedern und anderen Baugruppen im Projekt. Jede nicht leere Zelle enthält eine Zahl, die die Stärke der Verbindungen anzeigt (Anzahl der Mitglieder, Methoden, Felder, Typen oder Namensräume, die an der Kopplung beteiligt sind). Die Farbe dieser Zellen hat ebenfalls eine Bedeutung und kann Ihnen helfen, den Code zu identifizieren, der überarbeitet werden muss.

Code-Metriken-Ansicht

Die Metrikansicht ermöglicht die Visualisierung von Anwendungscodemetriken zum besseren Verständnis der Codebasis. In dieser Ansicht werden, je nach den gewählten Einstellungen, alle Methoden, Felder, Typen, Namespaces oder Assemblies durch ein farbiges Rechteck dargestellt. Standardmäßig ist die Ebene auf „Methode“ eingestellt, so dass alle Methoden, die in der Baugruppe gruppiert sind, in der Ansicht angezeigt werden. Die Größe jedes Rechtecks hängt von der Anzahl der Codezeilen und die Farbe von der metrischen zyklomatischen Komplexität ab. Sie können alle Einstellungen dieser Ansicht, einschließlich Farbgebung, Darstellung usw., leicht ändern.

Zusammenfassung

Fassen wir alles zusammen, was in diesem Artikel besprochen wurde. Die Verwendung von Codeanalysetools bedeutet nicht, dass die Codequalität auf magische Weise perfekt wird. Sie müssen die Codequalität systematisch überprüfen, um Probleme frühzeitig zu erkennen, und Analyzer sind dazu gedacht, dabei zu helfen.

Was NDepend betrifft, so haben wir versucht, eine möglichst umfassende und unvoreingenommene Überprüfung vorzunehmen. Wir haben die Lizenz kostenlos erhalten, ohne dass wir vom NDepend-Team unter Druck gesetzt wurden, den Artikel zu schreiben oder positive Rückmeldungen zu geben. Trotzdem sind wir nach einiger Zeit der Nutzung zu dem Schluss gekommen, dass dieses Tool wirklich hilfreich sein kann und zumindest einen kurzen Überblick über seine Funktionen verdient. NDepend ist ein wirklich leistungsstarkes Tool, das eine objektive, unparteiische Überprüfung Ihres Codes ermöglicht. Die Möglichkeit, die Analyse für jedes Projekt individuell anzupassen, birgt ein enormes Potenzial. In jedem Fall ist die einzige Möglichkeit zu entscheiden, ob es zu 100 % für Sie geeignet ist, es selbst auszuprobieren, zumal es eine Testversion gibt.