Lade Inhalt...

Statische Codeanalyse und Werkzeuge

Seminararbeit 2010 8 Seiten

Informatik - Angewandte Informatik

Leseprobe

Einordnung

Statische Codeanalyse ist ein Testverfahren, das vor allem in sicherheitskritischen Bereichen, aber auch bei weniger kritischen Anwendungen einge- setzt wird. Dieses Paper ist in zwei Teile gegliedert. Der Erste Teil (Abschnitt 2-3) befasst sich mit statischer Codeanalyse im Allgemeinen. Nach einer Einordnung und Abgrenzung zu anderen Testverfahren werden verschiedene Analysetypen vorgestellt. Der zweite Teil (Abschnitt 4-5) befasst sich mit Werkzeugen, die eingesetzt werden kon- nen, um eine statische Codeanalyse durchzufuhren. Nachdem in Abschnitt 4 verschiedene Anforderun- gen an Tools festgelegt werden, findet in Abschnitt 5 ein Vergleich mehrerer Tools statt.

1 Einleitung

Fehler im Quellcode wahrend der Entwicklungsphase eine Softwareprojekts sind unvermeidbar. Aber gerade in sicherheitsrelevanten Systemen, beispielsweise in der Medizin oder der Flugsicherung, spielt die Stabil- itat und Robustheit von Software eine extrem wichtige Rolle. Fehlerhafte Software fuhrt im schlimmsten Fall zum Tod von Menschen, wird aber in jedem Fall zu Imageverlust des Herstellers und hohen Kosten fuhren. Daher ist es wichtig, Fehler in Software moglichst fruh zu entdecken und zu beseitigen. Eine Moglichkeit, um Fehler zu entdecken, ist die statische Codeanalyse. Mit Hilfe der statischen Codeanalyse ist es moglich, auch Fehler zu entdecken, die wahrend der Laufzeit nur selten oder in bestimmten Zustanden auftreten. Dazu gehoren beispielsweise Null-Pointer- Dereferenzierungen, Buffer-Over- und Underflows, Race Conditions und so weiter.

Grundsatzlich unterschiedet man zwischen dynamis- chen und statischen Testverfahren. Bei dynamis- chen Testverfahren wird die Funktionalitat unter Aus- fuhrung von Code getestet. In diese Kategorie fall­en beispielsweise Unit- und Funktionstests. In die Kategorie der statischen Testverfahren dagegen fall­en beispielsweise manuelle Reviews und die statis­che Codeanalyse (vgl. [Fis10] [Lis08]). Statisch heiBt dabei, dass das Programm nicht ausgefuhrt wird, son- dern die Prufung nur anhand des Quelltextes stattfind- et.

Abbildung in dieser Leseprobe nicht enthalten

Unter statischer Codeanalyse versteht man das An- wenden eines Regelsatzes auf den Quellcode eines Programms (vgl. [Lig09], S.270). Da der Quell- text dem Regelsatz unterzogen wird, ist statische Codeanalyse auBerdem als White-Box-Testverfahren einzustufen. Die nachfolgende Grafik veranschaulicht den prinzipiellen Vorgang der statischen Codeanalyse:

Abbildung in dieser Leseprobe nicht enthalten

Liegt der Regelsatz bereits vor, so ist die statische Codeanalyse eine relativ simple Aufgabe. Selbstver- standlich kann die statische Codeanalyse manuell von einem Prufer durchgefuhrt werden. Bei umfangreichen Programmen wurde dies aber viel zu viel Zeit in Anspruch nehmen. Viel effizienter ist es, diese Auf­gabe Tools zu uberlassen, sodass nur noch die von diesen Tools erzeugten Reports von Hand analysiert werden mussen.

Statische Codeanalyse hat den Vorteil, dass sie bereits durchgefuhrt werden kann, bevor das Programm fer- tiggestellt ist. Fehler werden daher recht fruh entdeckt. Dies ist meistens billiger, als diesen Fehler durch Schreiben aufwendiger Testfalle in spateren Phasen zu finden (vgl. [And08a]). Statische Codeanalyse kann sogar dabei helfen, gute Testfalle fur dynamische Tests zu entwickeln. Wird mittels statischer Codeanalyse ein Fehler gefunden, dann kann dieser Fehler verbessert werden und ein Testfall spezifiziert werden, der diesen Fehler in Zukunft abdeckt. Dies kann eine Zeiterspar- nis gegenuber der klassischen Aquivalenzklassenbil- dung und Grenzwertanalyse darstellen (vgl. [And08b] [Lis08]).

Wenn es um das Testen von Funktionalitat geht, stoBt die statische Code jedoch bald an seine Grenzen. Soll eine Funktion den Flacheninhalt eines Kreises anhand des Radius berechnen und wird tatsachlich aber der Umfang berechnet, so wird der Fehler durch statische Codeanalyse nicht gefunden. (vgl. [And08b])

3 Analysetypen

Zur statischen Codeanalyse gehoren eine Reihe ver- schiedener Arten von Analysen mit unterschiedlichen Zielsetzungen. Die wichtigsten davon werden in diesem Abschnitt kurz erlautert.

3.1 Syntaxanalyse

Bei der Syntaxanalyse wird der Quellcode gegen Syntax- und Grammatikregeln gepruft. Tools, die eine Syntaxanalyse durchfuhren, sind Compiler und Inter­preter. Die Syntaxanalyse findet dabei bei jedem Com- pilerdurchlauf statt. Wird ein Fehler entdeckt, so wird eine Fehlermeldung erzeugt und der Compiliervor- gang wird abgebrochen. (vgl. [Hof08], S.272)

3.2 Stilanalyse

Bei der Stilanalyse kommen Regelwerke zum Einsatz, die den Programmierstil betreffen. Zum einen kon- nen dies beispielsweise firmeninterne Coding-Style- Guides sein. Dadurch wird der Code innerhalb ein- er Firma einheitlich gehalten und ist somit einfach- er zu lesen bzw. zu warten. Zum anderen konnen es aber auch Programmiersprachenspezifische Richtlin- ien sein. Ziel dieser Richtlinien ist es, unsichere Programmierkonstrukte zu vermeiden (vgl. [Lig09], S.271). Beispiele fur solche Standards sind Misra C oder JSF C++ (vgl. [And08a]). In vielen sicherheit- skritischen Bereichen von Software in eingebetteten Systemen ist die Einhaltung solcher Standards sogar vorgeschrieben (vgl. [Wik10b]).

Wahrend viele Programmierer die erste Variante aufgrund der besseren Ubersichtlichkeit bevorzugen, schreiben die Sun Code Conventions [Sun95] die zweite Variante vor.

Das folgende Codestuck zeigt ein Beispiel fur ein un- sicheres Programmierkonstrukt in C/C++:

Abbildung in dieser Leseprobe nicht enthalten

Es ist unklar, ob die Zuweisung beabsichtigt war, oder ob stattdessen ein Vergleich der beiden Variablen stat- tfinden sollte. Im ersten Fall ware es also besser, die Zuweisung vor dem if-Konstrukt zu platzieren (vgl. [Wik10b]):

Abbildung in dieser Leseprobe nicht enthalten

War ein Vergleich beabsichtigt, so ist entsprechend folgende Version richtig:

Abbildung in dieser Leseprobe nicht enthalten

3.3 Kontrollflussanalyse

Bei der Kontrollflussanalyse wird der Pro- grammablauf analysiert. Dabei werden beispielsweise Codefragmente gefunden, die in der Programmaus- fuhrung niemals erreicht werden konnen. Nachfolgend ein Beispiel:

Abbildung in dieser Leseprobe nicht enthalten

Die letzte Zeile wird niemals erreicht. Oftmals erken- nen bereits Compiler solche Fehler (zum Beispiel der Java-Compiler javac). Solcher Code fuhrt nicht zwangslaufig zu Fehlern. Jedoch ist mit hoher Wahrscheinlichkeit davon auszugehen, dass der Pro- grammierer dieses Fragments einen anderen Pro- grammablauf beabsichtigt hatte (vgl. [Hof08], S.313).

3.4 Datenflussanalyse

Bei der Datenflussanalyse wird der Zustand einer Variablen entlang eines Pfades betrachtet. Dazu wird zunachst ein Graph des Programms (bzw. einer Funk- tion) gebildet, der samtliche Pfade beinhaltet. An- schlieBend wird festgehalten, welche Aktionen ent­lang jedes Pfades mit dieser Variablen durchgefuhrt werden. Dabei kann man zwischen vier verschiedenen Aktionen unterscheiden (vgl. [Lig09], S.293ff):

- d: Definition (Wertzuweisung) der Variablen
- r: referenzieren (lesen) der Variablen
- u: undefinieren der Variablen (beispielsweise beim Verlassen einer Funktion bei einer lokalen Variablen, oder nach der Deklaration, wenn noch keine Wertzuweisung stattgefunden hat)
- -: es findet keine Aktion statt
In den dadurch entstandenen Zugriffssequenzen kon­nen verschiedene Muster auftauchen, die auf Fehler hinweisen:
- dd: es finden unmittelbar hintereinander zwei Zuweisungen einer Variablen statt
- du: nach einer Zuweisung wird die Variable un- definiert
- ur: eine Variable, die nicht definiert ist, wird ver- wendet

Die ersten beiden Muster mussen nicht zwangsweise Fehler sein, sondern konnen auch Absicht gewesen sein. Ein ur-Fehler dagegen ist fast immer ein Fehler und führt bei Programmausführung unter Umständen sogar zum Absturz. (vgl. [Hof08], S.315ff)
Man erkennt, dass es hier zwei mogliche Pfade gibt. Fur varl lassen sich folgende Sequenzen aufstellen:

Abbildung in dieser Leseprobe nicht enthalten

- 1-2-4-5:udru
- 1-2-3-4-5: u d - r u Entsprechend fur var2:
- 1-2-4-5:u-ru
- 1-2-3-4-5: u - dru

Bei varl taucht bei keinem der beiden Pfaden eines oder oben genannten Muster auf. Dagegen erkennt man bei var2 im ersten Pfad das ur-Muster - es wird also auf var2 zugegriffen, ohne dass zuvor ein Wert zugewiesen wurde. Hier liegt offenbar ein Fehler vor.

4 Anforderungen an Werkzeuge

Die Durchfuhrung einer statischen Codeanalyse ist meistens sehr aufwendig. Daher werden zu diesem Zweck Werkzeuge (Tools) eingesetzt. Diese Werkzeuge fuhren ein oder mehrere der in Abschnitt 3 vorgestellten Analysen durch und generieren Reports. Die Reports mussen anschlieBend von Hand durchge- sehen werden. Dabei gibt es Anforderungen, die diese Tools erfullen sollten. Die wichtigsten davon werden in diesem Abschnitt dargestellt.

4.1 Umfang der Analyse

Um eine groBe Anzahl an Fehlern zu finden, mussen moglichst viele bzw. effektive Analysen durchge­fuhrt werden. Altere Werkzeuge fuhren oftmals nur eine Stilanalyse durch. Dadurch wird zwar auch eine gewisse Anzahl an potentiellen Fehlern gefunden, langst aber nicht so viele wie mit zusatzlicher Daten- /Kontrollflussanalyse (vgl. [And08a]). Andererseits kann eine Prufung, ob der Quellcode beispielsweise.

[...]

Details

Seiten
8
Jahr
2010
ISBN (eBook)
9783656218968
ISBN (Buch)
9783656928263
Dateigröße
713 KB
Sprache
Deutsch
Katalognummer
v195625
Institution / Hochschule
Hochschule Offenburg
Note
1.0
Schlagworte
Codeanalyse Testverfahren Whitebox Blackbox Codesonar Klocwork Polyspace Coverity QA-C Misra Kontrollussanalyse Syntaxanalyse Stilanalyse Datenflussanalyse statischer Test Unittest Funktionstest

Autor

Zurück

Titel: Statische Codeanalyse und Werkzeuge