Programmverstehen. Andreas Zeller Lehrstuhl für Softwaretechnik Universität des Saarlandes, Saarbrücken 2005-12-12



Ähnliche Dokumente
Software Engineering, SoSe 07, WSI, D. Huson, (Original Author: A. Zeller), 4. Juni

Einführung in die Programmierung

Grundlagen der Theoretischen Informatik, SoSe 2008

GS-Buchhalter/GS-Office 2015 Saldovorträge in folgenden Wirtschaftsjahren erfassen

Daten sammeln, darstellen, auswerten

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

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Erstellen von x-y-diagrammen in OpenOffice.calc

Lineare Funktionen. 1 Proportionale Funktionen Definition Eigenschaften Steigungsdreieck 3

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Quadratische Gleichungen

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

5. Übung: PHP-Grundlagen

Grundlagen der Künstlichen Intelligenz

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Print2CAD 2017, 8th Generation. Netzwerkversionen

Zeichen bei Zahlen entschlüsseln

Software Engineering. Sommersemester 2012, Dr. Andreas Metzger

SCHRITT 1: Öffnen des Bildes und Auswahl der Option»Drucken«im Menü»Datei«...2. SCHRITT 2: Angeben des Papierformat im Dialog»Drucklayout«...

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

AutoTexte und AutoKorrektur unter Outlook verwenden

Systemvoraussetzung < zurück weiter >

Schuljahreswechsel im Schul-Webportal

Um die Patientenverwaltung von Sesam zu nutzen, muss man die Patienten natürlich zuerst in die Kartei eintragen.

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager -rückläufer Script. combit GmbH Untere Laube Konstanz

Konzepte der Informatik

1. EINLEITUNG 2. GLOBALE GRUPPEN Globale Gruppen anlegen

Lichtbrechung an Linsen

Anleitung für die Teilnahme an den Platzvergaben "Studio II, Studio IV und Studio VI" im Studiengang Bachelor Architektur SS15

Download, Installation und Autorisierung der Lasergene Software. Bitte unbedingt beachten!

Installation OMNIKEY 3121 USB

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Semestralklausur zur Vorlesung. Web Mining. Prof. J. Fürnkranz Technische Universität Darmstadt Sommersemester 2004 Termin:

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

LEITFADEN ZUR SCHÄTZUNG DER BEITRAGSNACHWEISE

R ist freie Software und kann von der Website.

Fragebogen zur Diplomarbeit von Thomas Friedrich

Enigmail Konfiguration

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

1 topologisches Sortieren

Gezielt über Folien hinweg springen

Woche 1: Was ist NLP? Die Geschichte des NLP.

Java Webentwicklung (mit JSP)

teamsync Kurzanleitung

ebanking Business: Beitragseinzug per SEPA-Lastschrift

SEPA-Umstellungsanleitung Profi cash

Version smarter mobile(zu finden unter Einstellungen, Siehe Bild) : Gerät/Typ(z.B. Panasonic Toughbook, Ipad Air, Handy Samsung S1):

Zahlen auf einen Blick

1 Vom Problem zum Programm

Theoretische Informatik SS 04 Übung 1

Bedienungsanleitung Albumdesigner. Neues Projekt: Bestehendes Projekt öffnen:

Auftragsbearbeitung 3.1

Ihr Benutzerhandbuch AVIRA ANTIVIR EXCHANGE

Welche Bereiche gibt es auf der Internetseite vom Bundes-Aufsichtsamt für Flugsicherung?

GEONET Anleitung für Web-Autoren

Geld Verdienen im Internet leicht gemacht

ecaros2 - Accountmanager

Kontakte Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

Hilfe zur Urlaubsplanung und Zeiterfassung

Dokumentation. estat Version 2.0

Bruchrechnung Wir teilen gerecht auf

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Programmieren für Ingenieure Sommer Ein Rechner. Rechner sind überall. Gerät, das mittels programmierbarer Rechenvorschriften Daten verarbeitet.

Benutzerhandbuch - Elterliche Kontrolle

Rente = laufende Zahlungen, die in regelmäßigen Zeitabschnitten (periodisch) wiederkehren Rentenperiode = Zeitabstand zwischen zwei Rentenzahlungen

Zwischenablage (Bilder, Texte,...)

Validierung und Verifikation

Speicher in der Cloud

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich

Einführung in. Logische Schaltungen

fungen Debugging Boris Tripolskij

Browsereinstellungen für moneycheck24 in Explorer unter Windows

1.3. Installation und Konfiguration von Filr Desktop

BEISPIELKLAUSUR Softwareentwicklung:

Datenbank LAP - Chefexperten Detailhandel

1 Einleitung. Lernziele. automatische Antworten bei Abwesenheit senden. Einstellungen für automatische Antworten Lerndauer. 4 Minuten.

Zählen von Objekten einer bestimmten Klasse

Rechenzentrum der Ruhr-Universität Bochum. Integration von egroupware an der RUB in Outlook 2010 mit Funambol

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

7.3 Einrichtung 13. Monatslohn. Auszahlung Ende Jahr / Ende der Beschäftigung

3 Wie bekommen Sie Passwortlevel 3 und einen Installateurscode?

Einführung zum Arbeiten mit Microsoft Visual C Express Edition

Doku zur Gebäudebrüter Datenbank

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Die StandbyBuchung. Hier finden Sie den Link zu StandbyBuchung:

Nikon Message Center

Einsatz von xalerator. bei den. Ergo Direkt Versicherungen. Bereich Versicherungstechnik/Leben

Professionelle Seminare im Bereich MS-Office

Künstliche Intelligenz Maschinelles Lernen

SMS-Dienst SMS-Dienst procar informatik AG Stand: FS 04/2011 Eschenweg Weiterstadt 1

Umsatz-Kosten-Treiber-Matrix Woodmark Consulting AG

Diana Lange. GENERATIVE GESTALTUNG Arten des Zufalls

Software- und Druckerzuweisung Selbstlernmaterialien

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Inhalt. Allgemeine Einführung. Argumentationsvermögen. Räumliches Vorstellungsvermögen. Begabungen und Fähigkeiten messen

Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen

Güte von Tests. die Wahrscheinlichkeit für den Fehler 2. Art bei der Testentscheidung, nämlich. falsch ist. Darauf haben wir bereits im Kapitel über

Transkript:

Programmverstehen Andreas Zeller Lehrstuhl für Softwaretechnik Universität des Saarlandes, Saarbrücken 2005-12-12 Software Reengineering An der Universität lernen Sie in der Regel das Entwickeln eines Programms ohne Vorgaben from scratch oder auf der grünen Wiese. Viel realistischer ist es jedoch, dass Sie alte Software vorfinden und warten ergänzen, portieren oder erweitern. Der Umgang mit Software-Altlasten ist das Problem der Softwaretechnik! Software Reengineering (2) Wartungskosten: nach wie vor 50 75% der Gesamtkosten 80% der kommerziellen Anwendungssoftware ist in COBOL geschrieben 3/4 davon monolithisch und > 20 Jahre Ein typischer Anwender in den USA hat 2200 Programme mit insgesamt 1,15 Mio LOC Deutsche COBOL-Programme sind zu 80% monolithisch sind zu 77% unstrukturiert enthalten zu 93% redundant gehaltene Daten, die aus Unwissenheit oder Unsicherheit nicht gelöscht werden Jede dritte Anweisung verwendet eine numerische Konstante oder ein Literal (d.h. hartcodierte Datenwerte) 1

Software Reengineering (3) Ein Wartungsprogrammierer ist für 32.000 Codezeilen verantwortlich Ein Wartungsprogrammierer benötigt 47% seiner Zeit für Programmanalyse 15% für Programmierung 28% für den Test 9% für die Dokumentation Entropiezuwachs: Die Komplexität einer Prozedur steigt nach einer Fehlerkorrektur um durchschnittlich 4% nach einer Änderung um 17% und nach einer Erweiterung um 26% Bei der US Air Force kostet die Änderung einer einzelnen Zeile 2500 3000$ (1990) Einige Begriffe Reverse Engineering Extraktion und Repräsentation von Informationen aus einem Software-System 1 in einer anderen Form oder auf höherem Abstraktionsniveau Restrukturierung Transformation zwischen Repräsentationsformalismen ohne Änderung der Funktionalität Reengineering Alle Aktivitäten, die nach Inbetriebnahme eines Programmsystems das Verständnis von Software erhöhen oder Wartbarkeit, Wiederverwendbarkeit oder Weiterentwickelbarkeit verbessern oder erst ermöglichen Reengineering = Reverse Engineering + Restrukturierung 1 Vgl. Forward Engineering: Transformation der abstrakten Spezifikation in eine konkrete Implementierung 2

Programmverstehen Programmverstehen ist der wichtigste (und älteste) Bestandteil des Reverse Engineering Typischerweise Konstruktion alternativer Sichten, die helfen, das System besser zu verstehen: Erzeugen eines Ablaufdiagramms / Struktogramms Querverweis-Tabellen (cross references) Anreichern von Quellcode um Metrikwerte UML-Diagramme aus OO-Quellcode Software-Visualisierung Schließen über Programme Zutaten: Programmcode, Programmläufe und Experimente Abhängig von den Zutaten unterscheiden wir folgende Verfahren, ein Programm zu verstehen: Experimente n kontrollierte Läufe Induktion n Läufe Beobachtung 1 Lauf Deduktion 0 Läufe 3

Deduktion Deduktion: Schließen vom (abstrakten) Code auf die (konkreten) möglichen Läufe Experimente n kontrollierte Läufe Induktion n Läufe Beobachtung 1 Lauf Deduktion 0 Läufe Grundlage: Programmcode (genauer: nur Programmcode) Program Slicing Program Slicing hat das Ziel, Anweisungen zu isolieren, die für bestimmte Programmzustände relevant sind: Abhängigkeiten zwischen Ein- und Ausgaben erkennen Anweisungen bestimmen, die andere beeinflussen können Auswirkungen von Code-Änderungen eingrenzen Zentrale Technik der Fokussierung auf relevante Teilaspekte des Programms 4

Beispiel: Summe und Produkt berechnen 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 kann mul hier beeinflussen? Slicing Program Slicing versucht, für eine Berechnung irrelevante Anweisungen eines Programms zu entfernen oder relevante Anweisungen zu markieren. Ergebnis: Eine Teilmenge des Programms ein Slice. Grundlage: Das Slicing-Kriterium (v, n) spezifiziert den Slice für eine Variable v bei einer Anweisung n. Ein Slice wird berechnet, indem möglichst viele Anweisungen des Programms gelöscht werden, ohne dass sich die Berechnung des Wertes für die Variable v bei der Anweisung n ändert. 5

Backward Slicing Backward-Slice: Anweisungen, die den Wert einer Variablen an einer Stelle im Programm beeinflussen 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); int main() { int a, b, sum, mul; mul = 1; a = read(); b = read(); while (a <= b) { mul = mul * a; a = a + 1; write(mul); Programm Backward-Slice für (mul, 13) Man betrachtet rückwärts Wirkungen früherer Anweisungen Forward Slicing Forward-Slice: alle Anweisungen, die durch eine Änderung der Variablen v bei der Anweisung n betroffen sind 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); int main() { int a, b, sum, mul; b = read(); while (a <= b) { sum = sum + a; mul = mul * a; a = a + 1; write(sum); write(mul); Programm Forward-Slice für (b, 6) Man betrachtet vorwärts die Auswirkungen im Programm 6

Programm-Abhängigkeits-Graph Grundlage des Program Slicing sind Programm-Abhängigkeits-Graphen (engl. program dependency graph, PDG) PDGs sind ähnlich aufgebaut wie Kontrollflussgraphen; ihre Kanten geben jedoch Kontroll- und Datenabhängigkeiten zwischen zwei Anweisungen A und B an: Zwischen A und B besteht eine Kontrollabhängigkeit, wenn A beeinflusst, ob oder wie oft B ausgeführt wird. Zwischen A und B besteht eine Datenabhängigkeit, wenn in A einer Variablen ein Wert zugewiesen und dieser Wert in B durch Auswertung dieser Variablen benutzt wird. Programm-Abhängigkeits-Graph (2) ENTRY 1 sum=0 mul=1 3 4 a=read() b=read() 5 6 while (a<=b) write(sum) 7 12 write(mul) 13 sum=sum+a 8 mul=mul*a 9 a=a+1 10 Kontrollabhängigkeit Datenabhängigkeit Slicing anhand des PDG Liegt der PDG vor, ist das Slicing selbst nur noch ein Erreichbarkeitsproblem. Zuerst besteht ein Slice-Kriterium im Graphen nur noch aus einem Knoten n, der auch für die in diesem Knoten zugewiesene Variable steht. Ein Forward-Slice besteht aus dem Teilgraphen, der alle von n aus erreichbaren Knoten enthält. Ein Backward-Slice besteht aus dem Teilgraphen, der alle Knoten enthält, von denen aus n zu erreichen ist. 7

Slice für (mul, 13) im PDG Backward-Slice für Zeile 13: ENTRY 1 sum=0 mul=1 4 a=read() 3 b=read() write(sum) 6 12 while (a<=b) 7 write(mul) 5 13 sum=sum+a 8 mul=mul*a 9 a=a+1 10 Mengenoperationen mit Slices A: Slice für Y B: Slice für X D: Schnitt A B (Backbone) E: Subtraktion A B (Dice) G: Subtraktion B A (Dice) 8

Dice Dice: Subtraktion zweier Slices 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); int main() { int a, b, sum, mul; mul = 1; mul = mul * a; write(mul); Programm Dice für (sum, 12) und (mul, 13) Grundidee: Fehlereingrenzung durch Dices (Subtraktion fehlerhafter korrekter Slice) Erweiterungen und Varianten Interprozedurales Slicing bestimmt Slices über Prozedurgrenzen hinweg Herausforderung: Trade-off zwischen Entfalten der Prozeduren an Aufrufstelle ( viel Platz) Zusammenfassen der Aufrufe ( Ungenauigkeit) Dynamisches Slicing bestimmt Slices für einen bestimmten Programmlauf Vorteil: Kontrollfluß ist bekannt exaktere Datenabhängigkeiten höhere Präzision als statisches Slicing Herausforderungen: Effiziente Code-Instrumentierung, präzise Kontrollabhängigkeiten 9

Visualisierung mit Imagix Imagix: Funktionen und Variablen 10

Imagix: Benutzung Imagix: Pretty Printing 11

Imagix: Flussdiagramm Imagix: Abdeckung 12

Statisch vs. Dynamisch Man unterscheidet Statische Programmanalyse bestimmt Eigenschaften eines Programms (= über alle möglichen Läufe) Technik: Deduktion Haupteinsatz: Verifikation Dynamische Programmanalyse bestimmt Eigenschaften eines Programmlaufs (oder mehrerer Programmläufe) Techniken: Beobachtung, Induktion, Experimentieren Haupteinsatz: Anomalien finden, Fehlersuche Beobachtung Mit Beobachtung kommen Fakten über einen konkreten Lauf hinzu: Experimente n kontrollierte Läufe Induktion n Läufe Beobachtung 1 Lauf Deduktion 0 Läufe Beispiel: Debugger, Abdeckung, Dynamische Slices Gewöhnlich beobachten Menschen das Programm 13

Jinsight: Programmläufe analysieren Induktion Induktion generiert Abstraktionen aus mehrfachen Läufen: Experimente n kontrollierte Läufe Induktion n Läufe Beobachtung 1 Lauf Deduktion 0 Läufe Beispiel: Abdeckung vergleichen, dynamische Dices, dynamische Invarianten Induktion hebt Anomalien hervor 14

Tarantula: Abdeckung vergleichen Invarianten bestimmen Grundidee: Aus konkreten Läufen Invarianten bestimmen Invarianten beschreiben, was über alle beobachteten Läufe gilt. Werden nur funktionierende Läufe betrachtet, kann man die so gewonnenen Invarianten benutzen, um ggf. Verletzungen in fehlschlagenden Läufen zu bestimmen. 15

Invarianten bestimmen mit DAIKON 2 Given Invariants Original Program Instrumented Program Trace File Likely Invariants Instrument Code Execute Program Detect Invariants User Test Suite Invarianten bestimmen mit DAIKON (2) $./sort 1 2 3 1 2 3 $./sort 4 5 6 4 5 6 DAIKON erkennt folgende Invarianten: std.shell_sort(int *;int;):::enter size == size(a[]) a[] one of [1, 2, 3], [4, 5, 6] size == 3 std.shell_sort(int *;int;):::exit1 a[] == orig(a[]) Model Mining Aus Methodenfolgen endliche Automaten generieren 2 Daikon http://pag.lcs.mit.edu/daikon/ 16

-1 <init>() clone!=null, size=0 containskey(), get() put() clone!=null, size>0 put(), containskey(), get() Experimentieren Experimentation findet Ursachen gegebener Wirkungen: Experimente n kontrollierte Läufe Induktion n Läufe Beobachtung 1 Lauf Deduktion 0 Läufe Beispiele: (manuelle) Fehlersuche Kann ebenfalls automatisiert werden 17

Systematisches Experimentieren Mozilla stürzt beim Drucken einer Webseite ab. 1 896 Zeilen! 2 448 Zeilen! 3 224 Zeilen! 4 112 Zeilen " 5 112 Zeilen! 6 56 Zeilen ". 57 <SELECT NAME="priority" MULTIPLE SIZE=7> 40 Zeichen! 58 <SELECT NAME="priority" MULTIPLE SIZE=7> 20 Zeichen " 59 <SELECT NAME="priority" MULTIPLE SIZE=7> 20 Zeichen " 60 <SELECT NAME="priority" MULTIPLE SIZE=7> 30 Zeichen " 61 <SELECT NAME="priority" MULTIPLE SIZE=7> 20 Zeichen! 62 <SELECT NAME="priority" MULTIPLE SIZE=7> 10 Zeichen!. 75 <SELECT NAME="priority" MULTIPLE SIZE=7> 8 Zeichen " 76 <SELECT NAME="priority" MULTIPLE SIZE=7> 8 Zeichen " 77 <SELECT NAME="priority" MULTIPLE SIZE=7> 8 Zeichen ". 90 <SELECT NAME="priority" MULTIPLE SIZE=7> 8 Zeichen! Vereinfachte Fehlerbeschreibung: Mozilla stürzt ab, wenn ich <SELECT> drucke. Weitere Anwendungen Fehlerverursachende Eingaben. Eine Eingabe verursacht einen Fehler. Welche (Teil-)Eingabe war fehlerverursachend? Fehlerverursachende Änderungen. Nach einer Änderung funktioniert das Programm nicht mehr. Welche (Teil-)Änderung war fehlerverursachend? Fehlerverursachende Programmzustände. Zwei Läufe einer funktioniert, einer schlägt fehl. Welche Unterschiede im Programmzustand sind fehlerverursachend? 18

Delta Debugging Failing Run Passing Run Delta Debugging Failing Run Passing Run 17

Delta Debugging Failing Run 20 ()->next 22 Passing Run www.askigor.org Programm einreichen Aufrufe angeben Auf Debug it klicken Diagnose kommt per e-mail 600 Einreichungen seit Dezember 2003 56% pinpoints the bug 22% helpful insights Delta Debugging Plug-Ins 18

Selbstheilende Programme 19

Rückblick und Ausblick Letzte 20 Jahre: Deduktion und Observations- Techniken Experimente n kontrollierte Läufe Induktion n Läufe Beobachtung 1 Lauf Deduktion 0 Läufe Nächste 20 Jahre: Induktion und Experimentieren? 19

Zusammenfassung Software Reengineering = Reverse Engineering + Restrukturierung Reverse Engineering ist die Extraktion und Repräsentation von Informationen aus einem Software-System Programmverstehen ist der wichtigste Bestandteil des Reverse Engineering Sichten wie Dokumentation, Benutzung, Abdeckung helfen, das Programm zu verstehen Zusammenfassung (2) Deduktion schließt vom Code auf mögliche Läufe Beobachtung betrachtet einen konkreten Lauf Induktion schließt von konkreten Läufen auf Abstraktionen Experimente finden (Fehler-)ursachen Mehr zum Thema Programmanalyse und Programmverstehen : Vorlesung Automated Debugging (SS 2006) Mehr zu aktuellen Forschungsthemen: Vortrag Dynamische Invarianten, Do 13 14 20