Software Engineering. Statische Analyse! Kapitel 11



Ähnliche Dokumente
Software Engineering. Statische Analyse! Kapitel 11

Software Engineering. Statische Analyse. Martin Glinz Harald Gall. Wintersemester 2006/07. Kapitel 11. Universität Zürich Institut für Informatik

Kapitel 5 Statische Programmanalyse

Kapitel 5: Statische Analyse

Software Engineering. Dokumentation! Kapitel 21

Software Engineering. Dokumentation. Wintersemester 2005/06. Kapitel 21. Universität Zürich Institut für Informatik

Seminar Werkzeuggestütze. tze Softwareprüfung. fung. Slicing. Sebastian Meyer

Software-Qualität Ausgewählte Kapitel

Validierung und Verifikation!

Requirements Engineering Research Group!

Validierung und Verifikation

Vorlesung Software-Reengineering

Requirements Engineering für IT Systeme

Einführung in die Programmierung

Software Engineering. Produktivitätsfaktoren! Kapitel 18

Requirements Engineering Die Dinge von Anfang an richtig machen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Requirements Engineering I

Requirements Engineering I. Verwalten von Anforderungen!

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Zeichen bei Zahlen entschlüsseln

Programmiersprachen und Übersetzer

Besprechung Übung 1 & Vorstellung Übung 2

Free your work. Free your work. Wir wollen Ihnen die Freiheit geben, sich auf Ihr Geschäft zu konzentrieren.

Einführung und Motivation

Praktikum Compilerbau

Whitebox-Tests: Allgemeines

Graphic Coding. Klausur. 9. Februar Kurs A

Qualität bei evolutionärer Entwicklung

Grammatiken. Einführung

VBA-Programmierung: Zusammenfassung

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Grundbegriffe der Informatik

Prozedurale Datenbank- Anwendungsprogrammierung

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

16 Architekturentwurf Einführung und Überblick

Übungen zu C++ Kapitel 1

Hauptseminar Automotive Software Engineering Testen, Rapid Prototyping und x in the loop

Was meinen die Leute eigentlich mit: Grexit?

1 topologisches Sortieren

Praktikum Grundlagen der Programmierung. Diverse Grundlagen. Dr. Karsten Tolle

Benutzerkonto unter Windows 2000

GEORG.NET Anbindung an Ihr ACTIVE-DIRECTORY

Nicht über uns ohne uns

1 Mathematische Grundlagen

Software- Qualitätsmanagement

Werkzeuggestützte Softwareprüfungen Statische Analyse und Metriken

.NET Code schützen. Projekt.NET. Version 1.0

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

Erster Bug: eine Motte

Vgl. Kapitel 4 aus Systematisches Requirements Engineering, Christoph Ebert

Requirements Engineering I. Der Spezifikationsprozess!

Java: Vererbung. Teil 3: super()

Gesicherte Prozeduren

Informationssystemanalyse Problemstellung 2 1. Trotz aller Methoden, Techniken usw. zeigen Untersuchungen sehr negative Ergebnisse:

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

Datensicherung. mit. Ocster Backup Pro. it.kröger Hinweis:

VB.net Programmierung und Beispielprogramm für GSV

Kapiteltests zum Leitprogramm Binäre Suchbäume

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am

Schnittstelle Drittmeldepflicht Ab ImmoTop

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Was ist Logische Programmierung?

1 Installation QTrans V2.0 unter Windows NT4

Lehrer: Einschreibemethoden

Datenstrukturen & Algorithmen

StuPro-Seminar Dokumentation in der Software-Wartung. StuPro-Seminar Probleme und Schwierigkeiten in der Software-Wartung.

WhiteStarUML Tutorial

Zur drittletzten Zeile scrollen

Empirische Softwaretechnik Kosten und Nutzen von UML in der Wartung Dr. Victor Pankratius Andreas Höfer Wintersemester 2009/2010

Rundung und Casting von Zahlen

PRÜFUNG FÜR ELEKTROINGENIEURE. Softwaretechnik I. Musterlösung SS Ohne Gewähr -

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Benutzerhandbuch MedHQ-App

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup

Informatik I Debugging

17 Architekturentwurf Vorgehen und Dokumentation

Einkaufsführer Hausverwaltung Was Sie bei Suche und Auswahl Ihres passenden Verwalters beachten sollten

Kapitel 10: Dokumentation

Software Engineering Interaktionsdiagramme

WEBSEITEN ENTWICKELN MIT ASP.NET

Success! Bestellausgabe

Konzepte der Informatik

BEISPIELKLAUSUR Softwareentwicklung:

Deskline 3.0. Vermieterinfo ChannelGateway

Dokumentenverwaltung im Internet

Kontrollstrukturen - Universität Köln

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Programmierkurs Java

Use Cases. Use Cases

Übersicht Programmablaufsteuerung

Installationsanleitung Maschinenkonfiguration und PP s. Release: VISI 21 Autor: Anja Gerlach Datum: 18. Dezember 2012 Update: 18.

Einführung in die C++ Programmierung für Ingenieure

Kurzanleitung /Kompalitätstest Barcode. Sie haben zwei Möglichkeiten unsere Barcode/Strichcodes für Ihren eigenen stationären Einzelhandel zu nutzen.

Erfahrungen mit Hartz IV- Empfängern

Algorithmische Mathematik

DHL Online Retoure - Magento Extension zur Erstellung der Retouren-Labels durch den Kunden im Frontend

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Typisierung des Replikationsplan Wirries, Denis Datenbankspezialist

Transkript:

Martin Glinz Thomas Fritz Software Engineering Kapitel 11 Statische Analyse 2005, 2013 Martin Glinz. Alle Rechte vorbehalten. Speicherung und Wiedergabe für den persönlichen, nicht kommerziellen Gebrauch gestattet; bei auszugsweiser Verwendung mit Quellenangabe. Verwendung für Unterrichtszwecke oder kommerziellen Gebrauch nur mit vorheriger schriftlicher Genehmigung des Autors.

11.1 Grundlagen 11.2 Formen der statischen Analyse 11.3 Programmanalyse 11.4 Abhängigkeitsgraphen Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 2

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.) Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 3

11.1 Grundlagen 11.2 Formen der statischen Analyse 11.3 Programmanalyse 11.4 Abhängigkeitsgraphen Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 4

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 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 5

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 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 6

Kontrollflussanalyse in Programmen Wege im Flussgraphen 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); } Führt jeder Pfad von hier zu write (sum)? Gibt es einen Pfad nach write (sum), der sum = 0 umgeht? Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 7

Datenflussanalyse in Programmen Zusammenhänge zwischen Definition und Verwendung von Daten 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? Wie entsteht dieser Wert? Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 8

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) Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 9

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 Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 10

11.1 Grundlagen 11.2 Formen der statischen Analyse 11.3 Programmanalyse 11.4 Abhängigkeitsgraphen Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 11

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 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 12

Vom Quelltext zum abstrakten Syntaxbaum Lexikalische Analyse Quelltext Lexer Tokenstrom Syntaktische Analyse Parser Abstrakter Syntaxbaum Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 13

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 -- ; 11 -- end Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 14

Der Parser Analyse des Tokenstroms nach den Regeln der Grammatik der verwendeten Programmiersprache Grammatik: Proc ::= PROCEDURE Id PL ";". PL ::= "(" Params ")" e. Params ::= Param "," Params Param. Param ::= Id. Ableitungsbaum Abstrakter Syntaxbaum Rainer Koschke Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 15

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) Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz und Harald Gall 16

Intra- und interprozeduraler Kontrollfluss Software Engineering Kapitel 11: Statische Analyse 2009 Harald Gall 17

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 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz und Harald Gall 18

Dominanz 2 Flussgraph Knoten 2 dominiert 4, 5, 6, 8, 9 1 S 2 3 5 7 4 6 8 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 E 9 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 19

Postdominanz Ein Knoten P postdominiert einen Knoten N, wenn jeder Pfad von N zum Endknoten den Knoten P enthält (entspricht Dominanz des umgekehrten Graphen). Flussgraph 1 S 2 3 5 7 4 6 8 Knoten 7 postdominiert 3, 5, aber nicht 2, 4, S Knoten 9 postdominiert 6, 8 aber nicht 4 Exit postdominiert alle Knoten E 9 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 20

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 1 S 2 3 5 4 6 Die Knoten 6, 8, 9 sind kontrollabhängig von 4, aber nicht von 2 und S 7 8 E 9 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 21

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; Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz und Harald Gall 22

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 Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz und Harald Gall 23

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. Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz und Harald Gall 24

11.1 Grundlagen 11.2 Formen der statischen Analyse 11.3 Programmanalyse 11.4 Abhängigkeitsgraphen Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 25

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 Software Engineering Kapitel 11: Statische Analyse 2009 Harald Gall 26

Beispiel PDG B ist datenabhängig von A A B B ist kontrollabhängig von A A B Software Engineering Kapitel 11: Statische Analyse 2009 Harald Gall 27

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 Software Engineering Kapitel 11: Statische Analyse 2009 Harald Gall 28

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; Software Engineering Kapitel 11: Statische Analyse 2009 Harald Gall 29

System Dependence Graph Software Engineering Kapitel 11: Statische Analyse 2009 Harald Gall 30

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. Software Engineering Kapitel 11: Statische Analyse 2013 Martin Glinz 31