Open Source im professionellen Einsatz
Linux-Magazin 08/2012
© Suzanne Tucker, 123RF.com

© Suzanne Tucker, 123RF.com

Werkzeuge zur statischen Codeanalyse

Fusselfreier Code

Tools zur statischen Analyse durchkämmen selbst gestrickten Code nach Fusseln und Knötchen. Was Open-Source-Werkzeuge für C, C++, Java und Python leisten, beschreibt dieser Artikel.

543

Beim Testen von Software hilft der Compiler nur eingeschränkt. Er prangert meist lediglich Tipp- und Syntaxfehler an. Speicherlecks, endlos laufende Schleifen oder Race Conditions dagegen erkennt der Entwickler erst, wenn das Programm läuft und mit den zuvor aufwändig erdachten Testdaten gegen die Wand fährt.

Zumindest einen Teil der aufgezählten Probleme kann entdecken, wer den Quellcode genau unter die Lupe nimmt. Das Paradebeispiel zeigt, wie in C und C++ aus dem Vergleich

if ( a == b ) ...

ein vergessenes Gleichheitszeichen eine Zuweisung macht:

if ( a = b ) ...

Gerade bei schwer lesbarem und umfangreichem Quellcode stößt der Mensch dabei jedoch an seine Grenzen. Ein falsch gesetztes Semikolon entdecken ist ähnlich schwierig, wie eine Nadel im Heuhaufen zu finden – wenn man denn überhaupt daran denkt, alle Strichpunkte zu überprüfen. Zudem kostet eine solche manuelle Inspektion extrem viel Zeit.

Automatische Assistenten

Glücklicherweise gibt es zahlreiche Werkzeuge, die eine solche statische Codeanalyse in Sekundenbruchteilen durchführen. In der Regel parsen sie zunächst den Quellcode ähnlich wie der Compiler. Mit dem dabei aufgebauten Wissen können sie dann nicht nur den Programmablauf auf Probleme abklopfen, sondern auch eine aufwändige Datenflussanalyse durchführen.

In seltenen Fällen starten sie sogar selbst generierten Objektcode – auch wenn das eigentlich nicht mehr zur statischen Codeanalyse gehört (siehe Grundlagenartikel in diesem Schwerpunkt).

Welche Fehler sich damit prinzipiell aufdecken lassen, fasst der Kasten "Fundstücke" zusammen. Manche Werkzeuge prüfen allerdings nur auf einen Teil dieses Katalogs. Einige erlauben es dem Entwickler immerhin, nachträglich weitere Prüfregeln hinzuzufügen. Häufig muss er sich dabei jedoch in eine kryptische Beschreibungssprache einarbeiten oder selbst entsprechende Prüfroutinen programmieren.

Fundstücke

Einige typische problematische Konstrukte, die eine statische Codeanalyse aufdecken kann:

  • Nicht initialisierte oder deklarierte Variablen
  • Nie verwendete Variablen, Funktionen und Klassen
  • Variablen, die zwischen zwei Zuweisungen nicht verwendet werden
  • Zeiger ins Nichts, Zugriff auf nicht existierende Objekte
  • Überschrittene Array- oder Listengrenzen
  • Probleme bei der Speicherverwaltung einschließlich Speicherlecks und Buffer Overflows
  • Code, der niemals erreicht werden kann
  • Überflüssige If-Abfragen
  • Endlos laufende Schleifen
  • Ergebnisse einer Funktion oder Methode werden nicht verwendet
  • Probleme beim Überladen von Methoden und Funktionen
  • Fehlende oder falsch verwendete Konstruktoren oder Destruktoren
  • Doppelte Codepassagen (unbedarftes Copy&Paste)
  • Probleme in den Vererbungsbeziehungen (zum Beispiel Zyklen)
  • Inkorrekte Implementierung von Schnittstellen
  • Inkorrektes Werfen und Fangen von Exceptions
  • Falsche Anzahl von Parametern und Parametertypen, insbesondere bei schwach typisierten Sprachen wie Python

Stil und Statistik

Wenn solch ein Tool schon mal den Quellcode in den Fingern hat, kann es gleich noch ein paar andere Dinge damit anstellen. So begutachten manche Werkzeuge die Formatierung des Quellcodes und übernehmen damit die Aufgaben eines Style-Checkers. Andere legen sogar umfangreiche Statistiken über den Quellcode an.

Fast jedes Werkzeug bewertet oder klassifiziert die entdeckten Probleme. Im einfachsten Fall unterscheidet ein Tool nur Fehler und Warnungen, differenzierter sind die ebenfalls beliebten Punktesysteme oder Noten. Besonders kritische Stellen erhalten einen höheren Punktwert als weniger gefährliche.

Da Werkzeuge zur statischen Codeanalyse direkt den Quellcode inspizieren, müssen sie die Eigenheiten der jeweiligen Programmiersprache und deren typische Problemzonen kennen. Während der Programmierer etwa in C und C++ manuell den Speicher verwalten muss, greift ihm in Java die Garbage Collection unter die Arme. Meist beschränken sich Werkzeuge daher auf eine einzige Programmiersprache.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Pylint 1.0: Neue Checks und Python 3.3

    Nach zehn Jahren Entwicklung hat Pylint, ein statisches Analyse-Tool für die Programmiersprache Python, die Versionsnummer 1.0 erreicht.

  • Statische Codeanalyse für PHP

    Das Linux-Magazin 08/12 stellt freie Tools zur statischen Codeanalyse für C/C++, Java und Python vor. Dieser Artikel beschreibt Werkzeuge für die Web-Skriptsprache PHP.

  • Vollwaschmittel

    Splint liest C-Quellcode und findet typische Programmierfehler, das klappt ohne Änderung am Code. Mit etwas Zusatzaufwand ist aber noch mehr drin: In speziellen Kommentaren beschreibt der Entwickler sein Programm, damit ihn Splint besser versteht und noch mehr schmutzige Codestellen entdeckt.

  • Leserbriefe
  • Static Code Analyzer

    Admins jonglieren fast täglich mit Quellcode. Shell- und Python-Skripte automatisieren Aufgaben, auf Servern laufen PHP- und Javascript-Anwendungen. Verantwortungsbewusste Admins testen ihre Software daher vor Inbetriebnahme, ein paar ausgeklügelte Tools sagen ihnen, wo es noch wehtut.

comments powered by Disqus

Ausgabe 01/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.