• Keine Ergebnisse gefunden

Software Engineering

N/A
N/A
Protected

Academic year: 2022

Aktie "Software Engineering"

Copied!
31
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Martin Glinz Thomas Fritz


Software Engineering

Kapitel 11


Statische Analyse !

(2)

11.1 Grundlagen!

11.2 Formen der statischen Analyse!

11.3 Programmanalyse!

11.4 Abhängigkeitsgraphen!

!

!

(3)

Grundlagen!

Statische Analyse ist die Untersuchung des statischen Aufbaus eines Prüflings auf die Erfüllung vorgegebener Kriterien.!

Keine Programmausführung (Abgrenzung zum Testen)!

Formal und automatisierbar ( Abgrenzung zum Review)!

Ziele:!

●  Bewertung von Qualitätsmerkmalen, z.B. Pflegbarkeit, Testbarkeit aufgrund struktureller Eigenschaften des Prüflings!

●  Erkennung von Fehlern und Anomalien in neu erstellter Software!

●  Erkennung und Analyse von Programmstrukturen bei der Pflege und beim Reengineering von Altsystemen (legacy systems)!

●  Prüfen, ob ein Programm formale Vorgaben einhält (Codierrichtlinien, Namenskonventionen, etc.)!

(4)

11.1 Grundlagen!

11.2 Formen der statischen Analyse!

11.3 Programmanalyse!

11.4 Abhängigkeitsgraphen!

!

!

(5)

Syntaktische Analyse von Programmen!

Analyse in der Regel bei der Programmübersetzung durch Compiler!

Syntaktische Korrektheit des Quellcode!

Datentypen, Typverträglichkeit!

●  Typ-unverträgliche Operationen!

●  Typ-unverträgliche Zuweisungen!

●  Typ-unverträgliche Operationsaufrufe!

(6)

Strukturanalyse von Programmen!

Formale Eigenschaften!

●  Richtlinien eingehalten!

●  Art und Menge der internen Dokumentation!

Strukturkomplexität des Programms!

●  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!

(7)

Kontrollflussanalyse in Programmen!

Wege im Flussgraphen!

Führt jeder Pfad von 
 hier zu write (sum)?!

int main() {!

int a, b, sum, mul;!

sum = 0;!

mul = 1;!

a = read ();!

b = read ();!

while (a<=b) {!

sum = sum + a;!

mul = mul * a;!

a = a +1;!

}!

write (sum);!

write (mul);!

Gibt es einen Pfad nach
 write (sum), der sum = 0
 umgeht?!

(8)

Datenflussanalyse in Programmen!

Zusammenhänge zwischen Definition und Verwendung von Daten!

Wie entsteht
 dieser Wert?!

int main() {!

int a, b, sum, mul;!

sum = 0;!

mul = 1;!

a = read ();!

b = read ();!

while (a<=b) {!

sum = sum + a;!

mul = mul * a;!

a = a +1;!

}!

write (sum);!

write (mul);!

Was wird durch diese
 Anweisung beeinflusst?!

(9)

Statische Analyse anderer Software-Artefakte!

❍ 

Analyse von Algorithmen!

●  Laufzeiteffizienz!

●  Speichereffizienz!

●  Gültigkeitsbereich!

●  Erfolgt weitestgehend manuell!

❍ 

Analyse von Spezifikationen, Entwürfen, 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)!

(10)

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!

(11)

11.1 Grundlagen!

11.2 Formen der statischen Analyse!

11.3 Programmanalyse!

11.4 Abhängigkeitsgraphen!

!

!

(12)

Grundlagen!

Grundlegende Analysen!

●  Kontrollflussanalyse (control flow analysis, Steuerflussanalyse)!

●  Datenflussanalyse (data flow analysis)!

Basis für alle weitergehenden Analysen!

Analyse erfolgt nicht auf dem Quelltext, sondern dem abstrakten Syntaxbaum!

(13)

Vom Quelltext zum abstrakten Syntaxbaum!

Lexikalische Analyse!

Syntaktische Analyse!

Quelltext! Token-

strom!

Abstrakter Syntaxbaum! Lexer!

Parser!

(14)

Der Lexer!

Quelltext:!

!

declare!

X : real;!

begin!

X := A * 5;! end!

!

Tokenstrom:!

!

9 -- “declare”!

4 -- id, !“X”!

7 -- “:”!

4 -- id, !“real”!

5 -- “;”!

6 -- “begin”!

4 -- id, !“X”!

3 -- “:=“!

4 -- id, !“A”!

8 -- “*”!

10 -- int_lit, !“5”! 5 -- “;”!

(15)

Der Parser!

Analyse des Tokenstroms nach den Regeln der Grammatik der verwendeten Programmiersprache!

Proc ::= PROCEDURE Id PL ";" .!

PL ::= "(" Params ")" | e .!

Params ::= Param "," Params | Param .! Param ::= Id .!

Grammatik:!

Ableitungsbaum!

Abstrakter Syntaxbaum!

(16)

Der Kontrollfluss (control flow, Steuerfluss)!

Intra-prozedural: Flussgraph!

●  Knoten: Grundblöcke!

●  Kanten: (bedingter/unbedingter Kontrollfluss!

●  ergibt sich aus Abläufen, Verzweigungen
 und Schleifen!

!

Inter-prozedural: Aufrufgraph!

●  Multigraph!

●  Knoten: Prozeduren!

●  Kanten: Aufruf!

●  ergibt sich aus expliziten Aufrufen im

Programmcode sowie indirekten Aufrufen (beispielsweise über Funktionszeiger in C)!

(17)

Intra- und interprozeduraler Kontrollfluss!

(18)

Dominanz!

Fragestellungen!

●  Gibt es eine Prozedur D, über nur die ein Aufruf von N erfolgt?!

●  Welcher Block D im Flussgraph muss in jedem Falle passiert werden, damit Block N ausgeführt werden kann?!

Antwort: D ist der Dominator von N!

●  Ein Knoten D dominiert einen Knoten N, wenn D auf allen Pfaden vom Startknoten zu N liegt.!

●  Ein Knoten D ist der direkte Dominator von N, wenn!

• 

D dominiert N und!

• 

alle weiteren Dominatoren von N dominieren D!

(19)

Dominanz – 2!

Knoten 2 dominiert 4, 5, 6, 8, 9!

Knoten 2 dominiert nicht S, 1, 3, 7, E!

Knoten 6 ist direkter Dominator von 8!

Knoten S, 2, 4 dominieren 8, sind aber keine direkten Dominatoren von 8!

❍  Knoten S dominiert alle Knoten des Flussgraphen!

Flussgraph!

S!

E! 1!

2!

3! 5!

4!

6!

9!

7! 8!

(20)

Postdominanz!

Knoten 7 postdominiert 3, 5, aber nicht 2, 4, S!

Knoten 9 postdominiert 6, 8
 aber nicht 4!

Exit postdominiert alle Knoten!

!

S!

1!

2!

3! 5!

4!

6!

7!

Flussgraph!

8!

Ein Knoten P postdominiert einen Knoten N, wenn jeder Pfad von N zum Endknoten den Knoten P enthält (entspricht Dominanz des umgekehrten Graphen).!

!

(21)

Kontrollabhängigkeit!

Ein Knoten X ist kontrollabhängig von einem Knoten B genau dann, wenn!

●  Es existiert ein nicht-leerer Pfad von B nach X, so dass X jeden

Knoten auf diesem Pfad postdominiert (mit Ausnahme von B selbst)!

●  X postdominiert B nicht oder X=B!

S!

1!

2!

3! 5!

4!

6!

7! 8!

Die Knoten 6, 8, 9 sind kontrollabhängig von 4,
 aber nicht von 2 und S!

(22)

Kontrollabhängigkeit – 2!

Für strukturierte Programme gilt:!

●  eine Anweisung ist kontrollabhängig von der Bedingung der nächstumgebenden Schleife oder Alternative!

!

while a loop!

if b then!

x := y; --- kontrollabhängig von b ! end if; !

z := 1; --- kontrollabhängig von a!

end loop;!

!

(23)

Datenabhängigkeitsanalyse!

Set = Setzen eines Werts!

Use = Verwendung eines Werts!

Daraus ergeben sich folgende relevanten Beziehungen zwischen zwei Anweisungen (resp. Knoten) A und B:!

●  Set-Use Beziehung (Datenabhängigkeit)!

• 

A setzt den Wert, der von B verwendet wird!

●  Use-Set Beziehung (Anti-Dependency)!

• 

A liest den Wert und B überschreibt ihn danach!

●  Set-Set Beziehung (Output-Dependency)!

• 

der von A gesetzte Wert wird von B überschrieben!

!

(24)

Datenabhängigkeit (Set-Use)!

Für die Zwecke der Analyse ist die Set-Use Beziehung die wichtigste Beziehung!

Zwischen der 2. und 3. Anweisung besteht eine “Use-Set”, zwischen der 1. und 3. Anweisung eine “Set-Set”-Beziehung.!

(25)

11.1 Grundlagen!

11.2 Formen der statischen Analyse!

11.3 Programmanalyse!

11.4 Abhängigkeitsgraphen!

!

!

(26)

Program Dependency Graph (PDG)!

PDG = gerichteter Multigraph für Daten- und Kontrollflussabhängigkeiten!

●  Knoten repräsentieren Zuweisungen und Prädikate!

• 

zusätzlich einen speziellen Entry-Knoten!

• 

zusätzlich Ø-Knoten zur Reduktion der Datenabhängigkeitskanten!

• 

(sowie einen Initial-Definition-Knoten für jede Variable, die benutzt werden kann, bevor sie gesetzt wird)!

●  Kontroll-Kanten repräsentieren Kontrollabhängigkeiten!

• 

Startknoten jeder Kontrollabhängigkeitskante ist entweder der Entry-Knoten oder ein Prädikatsknoten!

●  Fluss-Kanten repräsentieren Set-Use-Abhängigkeiten!

(27)

Beispiel PDG!

B ist datenabhängig von A!

!

!

B ist kontrollabhängig von A!

A! B!

A! B!

(28)

SDG und PDG!

PDG stellt Abhängigkeiten innerhalb einer Funktion dar!

System Dependency Graph (SDG) stellt globale Abhängigkeiten dar:


PDGs für verschiedene Unterprogramme werden vernetzt über interprozedurale Kontroll- und Datenflusskanten!

●  Aufruf: Call-Knoten!

●  aktuelle Parameter: actual-in / actual-out-Knoten (copy-in/copy-out- Parameterübergabe vorausgesetzt)!

●  formale Parameter: formal-in / formal-out-Knoten!

●  transitive Abhängigkeiten via PDG: Summary-Edges!

(29)

Modellierung des Prozeduraufrufs!

x_in := sum3;!

y_in := i3;!

A;!

sum2 := x_out;!

i2 := y_out;!

procedure A is!

begin!

x0 := x_in; y0 := y_in;!

...!

x_out := x1; y_out := y1;!

end A;!

!

(30)

System Dependence Graph!

(31)

Literatur!

!

!

K.B. Gallagher, J.R. Lyle (1991). Using Program Slicing in Software Maintenance. IEEE Transactions on Software Engineering, 17(8):751-761.!

S. Horwitz, T. Reps, D. Binkeley (1990). Interprocedural Slicing using Dependence Graphs. ACM Transactions on Programming Languages and Systems 12(1):35-46.!

R. Koschke, J.-F. Girard, M. Würthner (1998). An Intermediate Representation for Reverse Engineering Analyses. Proceedings of the Working Conference on Reverse Engineering.!

R. Morgan (1998). Building an Optimizing Compiler. Digital Press.!

M. Weiser (1984). Program Slicing. IEEE Transactions on Software Engineering 10(4):352-257.!

!

!

!

Referenzen

ÄHNLICHE DOKUMENTE

Computer-gestützte Programme für das Ge- wichtsmanagmeent seien zwar weniger wirk- sam als persönliche Interventionen, aber auf jeden FAll besser als nichts und auch ange- sichts

Und wenn ich das tue, möchte ich auch nicht Toleranz in Anspruch nehmen müssen - Toleranz würde ja nur bedeuten, dass ich zwar schon was und womöglich begründet dagegen habe,

Für die Beurteilung von abweichenden Situationen wird angenommen, dass sich die Störwirkung in Abhängigkeit der Anzahl Stop &amp; Go Ereignisse verändert. Bei einer minimal

Was wir oben in Abschnitt 2 gemacht haben, hat zum Beweis von Satz 2.1 (und damit auch Satz 1.1) gereicht, aber es läßt Wünsche offen: In den Aussagen B , C , D , E , G und H von

Wenngleich das Konzept quattromodaler Knoten einen gewissen Interpretationsspielraum lässt – so werden etwa die Pipeline, Normal- und Breitspur sowie die Binnen- und

Dabei ist eine weitere Vorausset- zung, daß es sich um eine mäßige Verkehrsdichte handelt, und gänz- lich außer acht gelassen werden die psychischen Komponenten, bei de- nen

Technische Universität München, Fakultät für Medizin, Klinik und Poliklinik für Derma- tologie und

So kann es sich für lokale Einzelhändler oder Dienstleister durchaus auszahlen, wenn Eltern wissen, dass die erweiterten Öffnungszeiten des Kinderhortes einer Förderung durch