Statische Codeanalyse

R 2.0.0

Was ist statische Codeanalyse?

Was ist statische Codeanalyse?

Der Prozess der Bewertung eines Testobjekts (Komponente oder System) basierend auf seiner Form, seiner Struktur, seines Inhalts oder seiner Dokumentation, ohne es auszuführen.

Anwendungsbeispiel

Anwendungsbeispiel
ALT MISSING

Hilde saß in der Aula der Gesamtschule und sah durch das Fenster, wie der schöne Spätsommerabend den Schulhof in ein warmes Licht tauchte. Zum wiederholten Male musste die Probe des Hobby-Orchesters vom Dirigenten unterbrochen werden. Sie saß im vorderen Bereich und legte die Geige nach dem letzten Versuch wieder auf ihren Beinen ab und lauschte den hitziger werdenden Diskussionen zwischen den Holzbläsern und Schlaginstrumenten in den Reihen hinter ihr. Die erste Probe für das alljährliche Konzert auf dem Stadtfest gestaltete sich zäh, zum Glück war noch genug Zeit bis zum Auftritt.

ALT MISSING

Einige Musiker waren neu dazugekommen, ebenso der Arrangeur und heute wurden die neuen Partituren verteilt. Hilde schwante bereits Böses als sie die eigenwillige Notation sah, ohne dass das Orchester auch nur eine Note gespielt hatte. Selbst erfahrenen Musikern dürfte es schwerfallen, sich an diesen Noten zu orientieren dachte sie sich. Und so kam es dann auch. Das Schlagwerk in der hintersten Reihe war schnell aus dem Takt geraten und der Einsatz der ratlos blickenden Holzbläser unklar. Hilde und die anderen Streicher spielten bislang noch keine einzige Note… Der Dirigent war mit rotem Kopf sichtlich bemüht, die Lage zu ordnen. Die Noten waren offenbar unter Zeitdruck und vom Autor in seinem ganz eigenen Stil aufgeschrieben. Es entstand dadurch ein Wirrwarr einzelner Stimmen, Gleichzeitiges stand nicht sauber untereinander, es fehlten Zeichen usw. Man einigte sich darauf, diese erste Probe zu beenden und vor dem nächsten Treffen in der Folgewoche einen Termin einzuplanen, um die Partitur gemeinsam in kleiner Runde zu analysieren und zu überarbeiten. Es gab zum Glück ja noch genug Zeit zu reagieren.

ALT MISSING

Während sie schmunzelnd ihr Instrument sorgfältig in dem Koffer verstaute, kam ihr der Gedanke, dass sich die Aufgaben des Dirigenten durchaus mit denen vergleichen ließen, die sie als behördliche Projektleiterin zu lösen hatte. In der vergangenen Woche beispielsweise berichtete ihr Theo, der junge Testmanager inspiriert von einer Schulung. Ihm lag die Qualität des Projekts sehr am Herzen und er kam mit der Idee der Einführung statischer Analysen auf sie zu. Zunächst war sie skeptisch. Ohne dass bereits die Ausführung einer lauffähigen Software möglich war, sollten zu diesem frühen Zeitpunkt bereits erste Codezeilen einem Review unterzogen werden? War das nicht zu theoretisch für einen ersten Test?

ALT MISSING

Aber seine Erläuterungen, dass fehlende Vorgaben für eine einheitliche Umsetzung sowie unterschiedliche Stile der Entwickler auch schon mögliche Fehlerquellen darstellten, überzeugte sie. Auch die Aussage, diese Analyse so früh wie möglich anzusetzen, leuchtete ihr ein. Auf eine Art bestärkte sie auch die Erfahrung aus der heutigen Probe, denn auch hier war es ratsam, zunächst Stil und Qualität der geschriebenen Noten vor der eigentlichen Ausführung zu prüfen. Sowohl bei der Aufführung als auch beim Go-Live konnte man glücklicherweise noch frühzeitig reagieren, beides sollte ja schließlich kein Reinfall werden …

In der Aula waren sie nun auch wieder guter Dinge für die nächste gut vorbereitete Probe. Sie nutzten den schönen Sommerabend und ließen ihn gemeinsam im benachbarten Biergarten „ausklingen“.

Beschreibung

Statische Analysen des Quellcodes können bei der Qualitätssteigerung im Softwareentwicklungsprozess sehr hilfreich sein. Statisches Testen setzt im Gegensatz zum Dynamischen Testen kein laufendes Programm voraus. Die Prüfmethode wird noch vor der eigentlichen Ausführung der Software durchgeführt und kann für alle Artefakte genutzt werden, die relevant für die Softwareerstellung sind.

Da für die Durchführung der Statischen Codeanalyse der Quellcode und sein Aufbau bekannt sein muss, handelt es sich um ein sogenanntes White-Box Testverfahren.

Der Quellcode wird im Verlauf der Analyse untersucht und einer Reihe von formalen Prüfungen unterzogen. Auf diese Weise sollen bestimmte Arten von Fehlern entdeckt werden, z.B. Verstöße gegen festgelegte Programmierstandards, doppelter Code, Sicherheitslücken usw. Teilbereiche bis hin zu vollständigen Anwendungen können je nach gewähltem Verfahren analysiert werden.

Die Durchführung kann manuell, beispielsweise im Rahmen von Reviews oder Inspektionen mittels intensiver Betrachtung einer oder mehrerer Personen vorgenommen werden.

Zusätzlich erfolgen die Analysen auch werkzeuggestützt. Integrierte Entwicklungsumgebungen (IDEs) helfen den Entwicklern, die Einhaltung von Formatierungsregeln zu prüfen sowie Programmierfehler und schlechte Codepraktiken zu entdecken. Voraussetzung für diese automatisierte Prüfung ist, dass die Artefakte einer bestimmten formalen Struktur folgen. Ziel ist die Prävention von Fehlern und Abweichungen, die so früh wie möglich im Entwicklungsprozess greifen und kostenintensive Nachbesserungen verhindern soll.

Vorteile und Nutzen der statischen Methode

  • früher Einsatz vermeidet kostenintensive Korrekturen im Nachgang

  • Verstöße gegen festgelegte Standards bzw. best practices werden aufgedeckt

  • Verbessert Wartbarkeit durch das Aufdecken von zu komplexen und damit fehleranfälligen Abschnitten

  • Steigert die Qualität und verringert technische Schulden

  • Keine Ausführung der Software benötigt, daher geringer Aufwand in Vorbereitung (Umgebung, Testdaten) und Durchführung

  • Entwicklungsprozess wird optimiert

  • Ermöglicht konsistenten Code bei unterschiedlichen Entwickelnden

  • Architekturvalidierung möglich

  • Ergänzt funktionale Testfälle um Aspekte, die dadurch nur schwer zu entdecken sind (Sicherheitslücken, Performanceprobleme etc.)

Manuelle Reviews als statische Methode

Als manuelle statische Methoden zur Codeprüfung kommen unterschiedliche Review-Arten infrage, die je nach Bedürfnissen im Projekt und verfügbaren Ressourcen gewählt oder auch kombiniert werden können:

Das manuelle Verfahren bietet Vor- und Nachteile. Als Vorteile sind zu nennen, dass im Vergleich zu automatischen Routinen die manuelle Prüfung z.B. bei kritischen Codeteilen umfangreicher, erfahrungsbasiert und intensiver erfolgen kann. Die Nachteile der manuellen Durchführung liegen in der Aufgabe an sich begründet, die monoton, fehleranfällig und wenig kreativ sein kann. Sie besteht häufig aus sturem Anwenden einfacher Regeln auf einen umfangreichen Code und ist daher ein idealer Kandidat für eine Automatisierung. Darüber hinaus bedarf es bei der manuellen Durchführung der Analyse entsprechender Qualifikationen und Eignungen, z.B. bezüglich verwendeter Programmiersprachen oder sicherheitsrelevanter Prozesse. Durch den zeitlichen Aufwand wird diese Methode u.U. kostenintensiv.

Aus diesen Gründen stellt eine Kombination aus manuellen und automatisierten Methoden einen erfolgsversprechenden Weg dar, weshalb eine toolbasierte Unterstützung der Analyse ermöglicht werden sollte.

Automatisierung der statischen Analyse

Neben den genannten manuellen Reviews werden zur statischen Analyse des Quellcodes häufig automatisierte und werkzeuggestützte Methoden verwendet. Diese Analysetools haben unterschiedliche Funktionsumfänge. Diese Unterschiede liegen beispielsweise in den Berichtsmöglichkeiten, der Anpassbarkeit oder dem Umfang der Analysen von einfachen Fehlerprüfungen bis hin zum komplexen Aufspüren von Sicherheitslücken oder Architekturverletzungen.

Worauf ist bei der Auswahl des Werkzeugs zu achten?

Das Werkzeug sollte zur verwendeten Technologie, Programmiersprache sowie Compilern passen. Für alle gängigen Programmiersprachen gibt es geeignete Tools, die eine automatisierte statische Analyse ermöglichen. Weitere Aspekte, die es zu beachten gilt, sind die angebotenen Lizenzmodelle, Bedienbarkeit, Zertifizierungen, unterstützte Betriebssysteme, Erweiterbarkeit und die Frage, ob das Tool für die Größe des Projekts angemessen ist und die geforderten Metriken berichten kann.

Bekannte Beispiele:

  • Lint

  • PMD

  • Checkstyle

  • Findbugs (Spotbugs)

  • SonarQube

  • jQAssistant

  • v.m

Eine Liste der Werkzeuge nach Programmiersprachen findet man in folgendem Wikipedia Artikel.

Wie funktioniert die Einordnung in den Entwicklungsprozess

Die statische Codeanalyse und somit das frühe Aufdecken von Fehlern sollte in den Entwicklungsprozess integriert sein. Sie lässt sich wie beschrieben von Hand oder automatisiert Durchführen.

In einer hohen Ausbaustufe erfolgt beim Einsatz von Continuous Integration der gesamte Prozess idealerweise automatisch bei jedem Update des Codes. Eine Einbettung der statischen Analyse in eine bestehende CI/CD-Pipeline erfordert neben der Auswahl und Konfiguration eines passenden Tools die Definition eines neuen Schrittes im Prozess. Dieser Schritt zur Codeanalyse kann separat erfolgen oder Teil des Build Prozesses sein. Für das Projekt bedeutet diese Einführung zunächst Mehrkosten, die sich jedoch in der Folge durch Zeitgewinne und Qualitätssteigerungen rentieren werden.

Beim Einsatz mehrerer Entwicklerteams sollte eine Einigung auf gemeinsam definierte und anzuwendende best practices bzw. Richtlinien erfolgen. Darüber hinaus sollten die Analyseergebnisse in brauchbarer Form berichtet und durch das Team überprüft werden können.

Die Kombination und der komplementäre Einsatz statischer und dynamischer Testmethoden im Entwicklungsprozess ist zu empfehlen, bei dem die statische Codeanalyse bereits zu einem frühen Zeitpunkt eingesetzt werden sollte.

Quellen