Statische Softwareanalyse

Wie sich Software ohne Testfälle testen lässt

Seite: 2/2

Anbieter zum Thema

Fortgeschrittene Methoden finden knifflige Fehler

Bild 2: Dieser Programmauszug enthält ein „memory leak“ in Zeile 17, was Goanna meldet
Bild 2: Dieser Programmauszug enthält ein „memory leak“ in Zeile 17, was Goanna meldet
(Hitex)
Es gibt allerdings auch (wenige) MISRA-Regeln, bei der die Prüfung Analysen erfordern, die über die syntaktische Mustererkennung hinausgehen. Beispielsweise fordert die MISRA-Regel 14.1, dass kein unerreichbarere Code vorhanden sein darf („There shall be no unreachable code“). Auch hier gibt es einfache Fälle: Folgt beispielsweise eine Anweisung direkt auf eine break-Anweisung, so wird diese Anweisung offensichtlich und leicht zu erkennen niemals ausgeführt werden.

Aber es gibt auch viel schwieriger zu erkennende Situationen von unerreichbarem Code und anderen potentiellen Programmfehlern. Um diese zu erkennen, benötigt man moderne Methoden der Programmanalyse. Im Programmauszug im Bild 2 verbirgt sich ein sogenanntes „memory leak“. Das bedeutet, dass nicht aller allokierter Speicher auch wieder freigeben wird. Zu Beginn der Funktion func1() im Bild 2 wird zunächst mit dem Schlüsselwort „new“ Speicher allokiert, auf den der Zeiger p zeigt. Am Ende der Funktion func1() wird der Speicher wieder freigeben, aber nicht auf jedem möglichen Pfad. Goanna, ein Werkzeug zur statischen Analyse von Software, zeigt dies durch eine Meldung zu Zeile 17 des Programmauszugs in Bild 2 an.

Bild 3: Goanna gibt den Pfad durch das Ende von func1() ohne Aufruf von dealloc() an
Bild 3: Goanna gibt den Pfad durch das Ende von func1() ohne Aufruf von dealloc() an
(Hitex)
Um eine solche Meldung anzeigen zu können, muss Goanna erkennen, dass die Freigabe des Speichers, auf den der Zeiger p zeigt, in der Funktion dealloc() erfolgt. Diese Fähigkeit nennt sich „interprozedurale Analyse“. In unserem Fall steht die Funktion dealloc() direkt vor func1(), was diese Gegebenheit für einen Menschen offensichtlich macht. Allerdings könnte dealloc() auch in einer anderen Quelldatei definiert sein, was es für Menschen schwerer macht, für ein Werkzeug jedoch nicht.

Goanna behauptet nun, dass es mindestens einen Pfad durch das Ende von func1() gibt, auf dem kein Aufruf der Funktion dealloc() erfolgt. Der Einfachheit halber gibt Goanna diesen Pfad dann auch an (siehe Bild 3). Der Pfad beginnt in Zeile 17, in der der Zeiger p definiert und zugewiesen wird. Wenn dann in Zeile 21 die Variable ok unwahr ist; in Zeile 23 die Variable error1 wahr ist; in Zeile 24 die Variable keypressed unwahr ist; und in Zeile 26 die Variable error2 ebenfalls unwahr ist: Dann gibt es keinen Aufruf von dealloc() und der Speicher wird nicht freigeben.

Software mit Model Checking überprüfen

Um das herauszufinden, könnte man alle möglichen Pfade auflisten und für jeden Pfad untersuchen, ob in ihm dealloc() aufgerufen wird oder nicht. Im Beispiel könnte das sogar mit vertretbarem Aufwand durchgeführt werden, weil die Anzahl der Pfade überschaubar ist. Leider wächst jedoch die Anzahl der Pfade exponentiell mit der Anzahl der Bedingungen. Deshalb verwendet Goanna für Prüfungen dieser Art das „Model Checking“.

Bei diesem Verfahren wächst der Aufwand nur linear mit der Größe des Kontrollflussgraphen. Man kann Vorher-/Nachher-Bedingungen prüfen oder beispielsweise sicherstellen, dass auf jedes new in jedem Pfad mindestens ein delete erfolgt. Aber es gibt Einschränkungen: Beispielsweise lässt sich nicht zählen und prüfen, ob auf jedem Pfad genau so viel new wie delete vorkommen.

Goanna ist ein Werkzeug für Windows und Linux, das auf die neusten Methoden aufsetzt. Dabei handelt es sich um Model Checking, abstrakte Datenwertverfolgung und interprozedurale Analyse. Es werden Programme in C und C++ analysiert. Goanna Studio arbeitet mit Eclipse/CDT und Visual Studio zusammen; Goanna Central ist als Kommandozeilenversion für den Build-Prozess gedacht.

* Frank Büchner arbeitet als Senior Test Engineer bei Hitex Development Tools in Karlsruhe und Dr. Ralf Huuck leitet seit 2009 die Ausgründung der Goanna Technologie bei der Red Lizard Software Pty Ltd in Australien.

(ID:36419140)