Kapitel 5: Statische Analyse Inhalt 5.1 Grundlagen 5.2 Analyse von Programmen 5.3 Analyse von Algorithmen 5.4 Analyse von Spezifikationen, Entwürfen und Prüfvorschriften Schlüsselbegriffe Statische Prüfung von Strukturen, Zusammenhängen und Abläufen Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-1
5.1 Grundlagen Definition Statische Analyse ist die Untersuchung des statischen Aufbaus eines Prüflings auf die Erfüllung vorgegebener Kriterien. Die Prüfung ist statisch. Sie grenzt sich damit vom (dynamischen) Test ab. Sie ist formal durchführbar und damit automatisierbar. Sie grenzt sich damit vom Review ab. Ziele Bewertung von Qualitätsmerkmalen, z.b. Pflegbarkeit, Testbarkeit aufgrund struktureller Eigenschaften des Prüflings (zum Beispiel Komplexität, Anomalien) Erkennung von Fehlern und Anomalien in neu erstellter Software Erkennung und Analyse von Programmstrukturen bei der Pflege und beim Re-engineering von Altsystemen Prüfen, ob ein Programm formale Vorgaben (zum Beispiel Codierrichtlinien, Namenskonventionen, etc.) einhält Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-2
5.2 Analyse von Programmen 5.2.1 Gegenstand der Analyse Syntaxfehler Feststellung durch Compiler Datentyp-Fehler typ-unverträgliche Operationen typ-unverträgliche Zuweisungen typ-unverträgliche Operationsaufrufe Qualität der Programm- und Datenstrukturen Formale Eigenschaften Richtlinien eingehalten Art und Menge der internen Dokumentation Strukturkomplexität des Progamms Einhaltung von Strukturierungsregeln Art und Tiefe von Verschachtelungen Strukturfehler bzw. -anomalien nicht erreichbarer Code vorhandene, aber nicht benutzte Operationen benutzte, aber nicht vorhandene Operationen Fehler / Anomalien in den Daten nicht deklarierte Variablen nicht benutzte Variablen Benutzung nicht initialisierter Variablen Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-3
5.2.2 Vorgehen Bei Programmen immer mit Werkzeugen Compiler syntaxgestützte Editoren spezielle Analyse-Werkzeuge Programm wird wie bei der Übersetzung durch ein Werkzeug zerlegt (parsing) und in einer analysefreundlichen internen Struktur repräsentiert Dabei werden Syntaxfehler erkannt und erste Kenngrößen (z. B. Anzahl Codezeilen, Anzahl Kommentare) ermittelt Die resultierende interne Repräsentation des Programms wird verschiedenen Analysen unterworfen (z.b. statische Aufrufhierarchie, Strukturkomplexität, Datenflussanalyse) Die Befunde werden gesammelt, ggf. verdichtet und bewertet. Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-4
5.3 Analyse von Algorithmen Laufzeiteffizienz Speichereffizienz Gültigkeitsbereich Erfolgt weitestgehend manuell 5.4 Analyse von Spezifikationen, Entwürfen und Prüfvorschriften Syntaxanalyse der formal beschriebenen Teile Teilweise Struktur- und Flussanalysen (je nach verwendeter Modellierungsmethode) Analyse der Anforderungsverfolgung, wenn dokumentiert ist, welche Anforderung wo umgesetzt bzw. geprüft wird (werkzeuggestützt möglich) Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-5
Aufgaben Aufgabe 5.1 Führen Sie manuell einige statische Analysen für folgendes Java-Programm durch: int ComputeAResult (int x, int y, int n) { boolean a, b, c; int z = 0; for (int i = 1;!a &!b & i <= n; i++) { a = GetCondition (x, i); if (!a) b = GetCondition (y, i); else if (!b) z = 1; } if (a) z = Compute (x); else if (b) z = Compute (y); else z = Compute (x*y); return z; } a) Kenngrößen Anzahl Codezeilen (NCSS) c Anzahl Kommentarzeilen k Anzahl Programmzweige z Kommentardichte k/(c+k) Verzweigungsdichte z/c b) Datenanalysen nicht benutzte Variablen Benutzung nicht initialisierter Variablen Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-6
Aufgabe 5.2 Führen Sie die gleichen Analysen wie in Aufgabe 5.1 für folgendes, mit dem Programm aus Aufgabe 5.1 äquivalentes Java-Programm durch: int ComputeAResult (int x, int y, int n) // Berechnet Funktionswert mittels der Methode Compute // aus x und y, abhängig von den Werten von GetCondition { for (int i = 1; i <= n; i++) { if (GetCondition (x, i)) return Compute (x); else if (GetCondition (y, i)) return Compute (y); } return Compute (x*y); } Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-7
Zitierte und weiterführende Literatur Ghezzi, C. (1981). Levels of Static Program Testing. In B. Chandrasekaran, S. Radicchi (Hrsg.): Computer Program Testing. New York: Elsevier North-Holland. Howden, W.E. (1981). A Survey of Static Analysis Methods. In E. Miller, W.E. Howden (Hrsg.): Software Testing and Validation Techniques: Tutorial. New York: IEEE Computer Society Press. 101-115. Liggesmeyer, P. (1990). Modultest und Modulverifikation. BI-Wissenschaftsverlag, Reihe Angewandte Informatik Bd. 4, Mannheim etc. Software-Qualitätsmanagement Kapitel 5: Statische Analyse Seite 5-8