Statische Analyse

Bugs und Defekte in Multitasking-Software eliminieren

Seite: 2/5

Anbieter zum Thema

Kriterien für die Codeabdeckung: Line und Path Coverage

Ein wichtiges Kriterium bei der Identifizierung und Beseitigung von Softwarefehlern ist die Codeabdeckung. Sie definiert, welcher Teil der Codebasis in welcher Tiefe untersucht wird, und lässt sich unterteilen in Line Coverage (Anweisungsabdeckung) und Path Coverage (Pfadabdeckung).

Die Line Coverage misst den Anteil aller Codezeilen, die auf Defekte untersucht werden. In vielen Embedded-Projekten liegt das Ziel bei einer Line Coverage von 100 %, was sich aufgrund technischer Einschränkungen jedoch häufig nicht vollständig umsetzen lässt. Doch selbst wenn 100 % Line Coverage erreicht werden, ist noch längst nicht sichergestellt, dass alle Defekte im Code identifiziert werden. Hier ein Beispiel:

void npd_switcher(int cond) {

char * c = 0;

char d[] = “a”;

if (cond) {

c = d;

*c = ‘b’;

}

*c = ‘c’;

}

In diesem Beispiel wird über einen einzelnen Testfall, der npd_switcher(1); aufruft, jede Codezeile der Funktion ausgeführt. Es wird zwar eine Line Coverage von 100 % erreicht, doch es befindet sich immer noch ein gravierender Fehler im Code. Wenn die Eingangsvariable cond den Wert 0 hat, versucht die letzte Zuweisungsanordnung in der Funktion, die Adresse 0 zu beschreiben; ein Null-Pointer-Zugriff ist jedoch nicht erwünscht. Trotz 100 Prozent Line Coverage bleibt ein grundlegender Fehler unentdeckt.

Die effektivere Methode der Abdeckung ist die Path Coverage. Sie misst den Anteil aller Pfade durch jede Funktion einer Applikation, die auf Fehler überprüft werden sollen. Stellen Sie sich vor, Sie erzeugen einen Ablaufplan für eine Applikation, in dem jeder Entscheidungspunkt (if, while, switch, etc.) eine Verzweigung im Ablaufplan darstellt.

Die obige Funktion npd_switcher(); hat zwei Pfade. Der erste Pfad nimmt bei if(cond) die Abzweigung TRUE und ist der gleiche Pfad, der für diesen Code 100 % Path Coverage erzielt hat. Der zweite Pfad folgt bei if(cond) der Abzweigung FALSE. Es ist ein realer Pfad, auch wenn es für die ELSE-Bedingung keinen Code gibt. Tatsächlich ist dieser zweite Pfad derjenige, der den vorher unentdeckten Null-Pointer-Zugriff enthält.

Wenn nun die Path-Coverage-Methode so effizient ist, warum kommt sie dann nicht immer zum Einsatz? Die Antwort ist einfach: Die technische Umsetzung ist nahezu unmöglich, und der Arbeitsaufwand wäre unglaublich hoch. Die Anzahl von Pfaden in einer Softwarefunktion kann exponentiell zu der Anzahl an Zuständen und Entscheidungen im Code ansteigen. Schleifen können zu einer sehr großen Anzahl von Pfaden führen.

Um die Path Coverage Methode effektiv einzusetzen, muss man also die Anzahl der zu überprüfenden Pfade begrenzen. Nehmen wir als Beispiel die Norm DO-178B Level „A“ – der höchste Level, bei dem ein Softwareausfall in einem sich in der Luft befindlichen Flugzeug katastrophale Folgen hätte.

Diese Norm fordert bei Software für Luftfahrtanwendungen den Abdeckungsgrad „Modified Condition/Decision Coverage“ (MC/DC). Im Wesentlichen besagt dies, dass an jeder Abzweigung in der Software jeder Zustand und jede Entscheidung auszuführen sind und damit mindestens einmal jeden möglichen Wert annehmen.

(ID:44759460)