Statische Code-Analyse
Statische Code-Analyse oder kurz statische Analyse ist ein statisches Software-Testverfahren, das zur Übersetzungszeit durchgeführt wird. Der Quelltext wird hierbei einer Reihe formaler Prüfungen unterzogen, bei denen bestimmte Sorten von Fehlern entdeckt werden können, noch bevor die entsprechende Software (z. B. im Modultest) ausgeführt wird. Die Methodik gehört zu den falsifizierenden Verfahren, d. h., es wird die Anwesenheit von Fehlern bestimmt.
In Anlehnung an das klassische Programm Lint wird der Vorgang auch als linten (englisch linting) bezeichnet.
Methodischer Zusammenhang
BearbeitenEinordnung
BearbeitenIm Rahmen der Softwaretestverfahren ist die Statische Code-Analyse den White-Box-Test-Verfahren zuzuordnen (man benötigt den Quellcode). Die Analyse kann durch manuelle Inspektion erfolgen, aber auch automatisch durch ein Programm. Man spricht dann von statischer Analyse, da die zu testende Software in Form von Algorithmen und Daten in ihrer Formulierung und Beschaffenheit (statisch) dem Prüfer (oder Werkzeug) vorliegt.
Abgrenzung
BearbeitenVorläufer der statischen Analyse sind die Prüfverfahren der normierten Programmierung und die Werkzeuge zur Erkennung von Code-Mustern, die sogenannten Style Checker.
Dynamische Code-Analyse setzt im Gegensatz zur statischen Analyse ein laufendes Programm voraus. Ein dynamisches Pendant zur statischen Code-Analyse zur Compilezeit ist z. B. das Profiling zur Laufzeit.
Verfahren
BearbeitenNeben dem gewissenhaften Studium von Quelltext durch Entwickler ist es möglich, viele inhaltliche Fehler werkzeuggestützt oder automatisch zu erkennen. Die Bandbreite reicht von der Sicherstellung von einfachen Coding-Standards (z. B. ein return
-Statement pro Funktion) über die Prüfung von Typumwandlungen und Bereichsgrenzen über die Suche nach bestimmten Arten von Speicherlecks bis hin zur technischen Verifikation von Quelltext.
Einfache Analysen sind häufig bereits im Compiler (Übersetzer) einer Programmiersprache integriert, z. B. die Prüfung auf Initialisierung einer Variablen. Darüber hinaus gibt es Methoden, die den Programmierstil auf Ästhetik und Pragmatik prüfen, nämlich die stilistischen Methoden. Allerdings werden häufig nur Warnmeldungen angezeigt, die ignoriert werden können. Bei sogenannten Profilern wird zusätzlicher Objektcode generiert, welcher Aussagen über Codeabdeckung und Codefrequentierung generiert.
Semantik-basierte statische Analysatoren vereinfachen die Aufgabe der Durchsicht großer Programmteile durch systematische Überprüfungen auf angreifbare Stellen wie:
- Race Conditions
- Formatstring-Angriffe
- Pufferüberläufe
- Speicherlecks
- Zugriffe außerhalb gültiger Grenzen ("Out of Bound") bei Arrays
- Division durch 0
Der Einsatz von statischen Analyseverfahren wird mittlerweile von Safety-Normen wie ISO 26262, IEC 61508 oder DO-178C für sicherheitsrelevante Software vorgeschrieben.
Werkzeuge
BearbeitenAls „Klassiker“ auf diesem Gebiet sind neben Lint auch Checkstyle, FindBugs und PMD für Java oder Cppcheck für C/C++, Splint für C oder FxCop bzw. StyleCop für C# zu nennen.
Derartige Werkzeuge können nicht nur alleinstehend laufen, sondern auch integriert in die Entwicklungsumgebung bzw. in den Build Server. Sie beschränken sich nicht nur auf Kodierungsregeln wie beispielsweise die MISRA-C-Regeln, sondern erkennen auch funktionale und technische Fehler, potentielle Bugs sowie auch qualitative Schwachstellen im Code (so genannte Code-Smells), wie zum Beispiel duplizierten Code (auch Software-Klone genannt).
Einige Werkzeuge können den Code auch auf sicherheitsrelevante Programmierfehler wie zum Beispiel Pufferüberläufe oder Wettlaufsituationen prüfen, wie beispielsweise Rough Auditing Tool for Security (RATS).
Weiters gibt es noch Werkzeuge, die auch Architekturmetriken und die Konformität des Codes mit der Architekturspezifikation prüfen. Dazu gehören beispielsweise die Axivion Bauhaus Suite, ConQAT und Teamscale sowie Sonargraph und Sotograph.
Literatur
Bearbeiten- Christoph Bommer, Markus Spindler, Volkert Barr: Softwarewartung. Grundlagen, Management und Wartungstechniken. dpunkt-Verlag, Heidelberg 2008, ISBN 978-3-89864-482-2.
- Peter Liggesmeyer: Software-Qualität. Testen, Analysieren und Verifizieren von Software. 2. Auflage. Spektrum Akademischer Verlag, Heidelberg 2009, ISBN 978-3-8274-2056-5.
- Harry M. Sneed, Richard Seidl, Manfred Baumgartner: Software in Zahlen. Die Vermessung von Applikationen. Hanser, München 2010, ISBN 978-3-446-42175-2.
- Andreas Spillner, Tilo Linz: Basiswissen Softwaretest. Aus- und Weiterbildung zum Certified Tester. Foundation level nach ISTQB-Standard. 4., überarbeitete und aktualisierte Auflage. dpunkt-Verlag, Heidelberg 2010, ISBN 978-3-89864-642-0.
Weblinks
Bearbeiten- Episode 59: Static Code Analysis. Abgerufen am 23. September 2012 (Interview als Podcast-Beitrag auf Software Engineering Radio).