Reverse Engineering Neuentwicklung von Software ist die Ausnahme => Weiterentwicklung von Legacy-Systemen Designdokumentation veraltet Aufgabenstellung: „Ah prima, dass sie da sind, wir wollen für unser System (2 Millionen LOC) XML Support, bauen sie das doch mal ein“ Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Motivation Aufgaben: Wiedergewinnung von Design (Klassendiagramme, ...) Finden von Funktionalität Finden von Fehlerursachen (Benutzt viele Compilertechniken) Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Inhalt Volltextsuchtechniken (grep, google, find, ...) Compiler basierte Techniken (Cross-Referencing, ...) Dynamische Analysen Code Instrumentierung / Tracing Debugger Techniken Analyse der Versionshistorie Auswertung und Visualisierung (Clustering, ...) Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
1. Volltextsuche Low-Tech Ansätze: Compiler-Ansätze versagen oft: unterschiedliche (alte) Sprachversionen Mix aus vielen Sprachen zusätzliche Textdateien Sprachunabhängige Mechanismen Suchen mit regulären Ausdrücken Diff . . . Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Suchen in IDEs (Eclipse) suchen in aktueller Datei Edit -> Find (Ctrl-F) Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Suchen in IDEs (Eclipse) suchen in allen Dateien des Projekts Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
4. Suchen: TODO Edit class dialog File Save As Implementierung Unterklassen von UMLDiagram Fehlermeldung: Unnamed class diagram log4j: ERROR setFile(null,true) call failed. CFG-parse error during code generation for NewClass::m1 -> Abnormal termination in control flow java.lang.RuntimeException: Transition guards null and null are incompatible Alle anwendenden Vorkommen von getName() der Klasse UMLClass Wo wird "public" Flag für Klassen in der Codegenerierung erzeugt Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Aufgaben zur Volltextsuche: 4. Suchen: .... Alle anwendenden Vorkommen von getName() der Klasse UMLClass Compilertechniken notwendig (nächste Woche) Die war gemein Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Aufgaben zur Volltextsuche: Resumee: Große Dateisysteme können schnell durchsucht werden Man muss "geschickt" suchen: Textstücke manchmal zusammengesetzt Manchmal Zeilenumbrüche False Negatives: einige gesuchte Stellen werden nicht gefunden False Positives: es werden falsche Treffer angezeigt Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
JavaDoc zu File: Embedded Doku erlaubt gewisse Konsistenzprüfungen /** * Tests whether the file denoted by this abstract pathname is a * directory. * * @return <code>true</code> if and only if the file denoted by this * abstract pathname exists <em>and</em> is a directory; * <code>false</code> otherwise * * @throws SecurityException * If a security manager exists and its <code>{@link * java.lang.SecurityManager#checkRead(java.lang.String)}</code> * method denies read access to the file */ public boolean isDirectory() { Embedded Doku erlaubt gewisse Konsistenzprüfungen Doku wird mitgewartet Doku ist aktueller Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Einsatz von Compilertechniken: Symboltabellen Cross Referencing Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Erweiterte Symboltabelle Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Fachgebiet Software Engineering. Übersicht. © 27. 03 Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Tipps zur Completion Methode proposeCompletions ließt Attribut toBeCompleted schreibt Vorschläge in possibleCompletions CompletionSnipIt.txt von der Web Seite holen Testen mit FWT GUI Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Compilerbau Nachlese reguläre Ausdrücke: einfach aber ungenau genaue Analyse der Struktur von Texten Analyse von "statischer" Semantik per Symboltabelle (Cross Reference Table) Datenflussanalyse: "read-from" Beziehung Kontrollflulssanalyse: Ausführungsreihenfolgen Slicing: wer hat hier zum Wert der Variablen X beigetragen? Übung zu Hause: Importe mit Berücksichtigen Unbekannte Klassen per ClassLoader suchen Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Slicing Backward Slicing: was trägt zur aktuellen Zeile bei? Forward Slicing wo werden die Ergebnisse der aktuellen Zeile weiter verwendet Eigentlich toll Probleme: Fallunterscheidungen / Schleifen Vererbung Points-To-Analysis praktisch bisher nur selten verwendbar Hauptsächlich für C verbreitet Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Ausnutzung von Laufzeittypinformation schreibt Methode ClassFinder.addDotClassToSymbolTable() benutz java.lang.reflect Class.forName (String) Class. getDeclaredMethods () Method.getName () . . . Class.getDeclaredFields () Field.getName() Class.getInterfaces () Class.getSuperClass () testet im Dobs ClassFinder.addDotClassToSymbolTable ("java.lang.System"), ... Berücksichtigt im Parser die Importe Versucht unbekannte Klassen per ClassLoader zu laden (inklusive Attribute und Methoden) Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Übersicht Quelltextanalyse mit regulären Ausdrücken Compilertechniken Prozessanalyse Dynamische Analyse Datenanalyse Design Pattern Erkennung Analyse- und Visualisierungstechniken Clustering Plagiatserkennung Refactoring Hot Spots Designmetriken ... Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Versionsgeschichte Delta basierte Speicherung Pro Chunk: File und Zeile alter und oder neuer Text Datum der Änderung Autor Alte Zustände rekonstruierbar Letzter Autor einer Zeile Beitrag eines Autors (pro Zeitraum) . . . Delta Debugging Related Change Analysis Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Prozessanalyse Aufgabe: Wer hat wann die Methode getName der Klasse UMLClass gebaut? (Im Navigator – Contextmenu – Team – Show Annotation) Was wurde seit Donnerstag in UMLClass geändert? (Team – Compare With – By Date, New Date) Was wurde gleichzeitig noch verändert? Von wem? Wer hat die meisten Zeilen zum Fujaba Kern beigetragen? (http://www.se.eecs.uni-kassel.de/~cvscheck/repositories/Fujaba/statcvs-xml-out/ ) Wieviele? In welchen Packages? Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Übersicht Quelltextanalyse mit regulären Ausdrücken Compilertechniken Prozessanalyse Dynamische Analyse Datenanalyse Design Pattern Erkennung Analyse- und Visualisierungstechniken Clustering Plagiatserkennung Refactoring Hot Spots Designmetriken ... Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Debugger schrittweise Ausführung step over / step into conditional breakpoints manuell ein mühsames Geschäft JDI Programmierschnittstelle zur "Fernsteuerung" eines Debuggers Aufgabe: setzt einen Conditional Breakpoint auf System.out.println und findet Welcome To Fujaba Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Code Instrumentierung System.out.println am Anfang und am Ende jeder Methode => alle Methodenaufrufe und Rücksprünge nachvollziehbar (Auswertung durch zusätzliches Programm) noch genauer System.out.println bei jedem If und jeder Schleife => Statement Abfolge eindeutig rekonstruierbar Quellcodeinstrumentierung mit Compilertechniken (Aspektorientierte Techniken) Bei Java oft Byte-Code Instrumentierung Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Code Instrumentierung (2) Unzählige Anwendungen: Logging (für sporadisch auftretende Fehler) Profiling (kommt gleich) Code Coverage Differenzanalyse Probleme: Trace wächst irrsinnig schnell (Meist Einschränkungen auf bestimmte Packages nötig) Programm Slow-Down . . . Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Profiler statistische Auswertung zeilengenauer Traces DAS Mittel zur Effizienzsteigerung Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Aufgaben Conditional Breakpoint auf System.out.print, findet Welcome to Fujaba eclemma installieren Aspect zum Tracen aller Method Calls schreiben Fujaba einmal normal starten und schließen Fujaba einmal starten und Projekt anlegen Alten und neuen Trace verlgeichen Welche Zeilen realisieren die AboutBox? Das gleiche noch mal mit den Easter Egg Bugs ausprobieren Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Graphische Darstellung von Laufzeitdaten JSpider Dobs / Edobs Aufgabe: über welche Pointer findet man den Typ eines Attributs in einer Attributbedingung in einem Storydiagramm heraus? Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Graphische Darstellung von Laufzeitdaten Datenlog Browser: Object Flipbook Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Design Pattern Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Identifizierung von Zugriffsfunktionen Namenskonventionen: setXY, getXY Parameter- und Rückgabetypen müssen passen Im Rumpf Zugriff auf das ensprechende Attribut void setName (String value) { this.name = value; } Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Identifizierung von (zu-n) Assocs Problem: Speicherung in Container: Vector () neighbors; Eintragstyp unklar (wird mit Java 1.5 besser) Lösung: suche add Operationen und bestimme Eintragstyp: void addToNeighbors(C2 value) { this.neighbors.add (value); } Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Identifizierung von bidirektionalen Assocs finde paarweise auftretende add Operationen: ... x.addToN1 (y); y.setN2 (x); ... Achtung: das kann manchmal fuzzy sein Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Design Pattern Erkennung: Singleton privates, statisches Attribut vom Typ der eigenen Klasse public static get-Operation zur Initialisierung und zum Zugriff darauf public static get () { if (theInstance == null) { theInstance = new C (); } return theInstance; } eventuell private Konstruktor Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Design Pattern Erkennung Probleme Performance: Parserbaum für Gesamtprogramm meist zu groß, dauert ewig lazy Parsing der Methodenrümpfe Viele Implementierungsvarianten: Fuzzy Pattern Detection: Kein 1 zu 1 Match von Code Fragmenten Vorkommen von z.B. Attributzugriff reicht (Dis Jörg Niere) Statische Analyse allein reicht nicht: Traces analysieren (Current Work by Lothar Wendehals) Siehe Fujaba Reverse Engineering Tool Suite 4.2 www.fujaba.de UMLProject einparsen und analysieren. Mit anderen Klassen experimentieren Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Übersicht Quelltextanalyse mit regulären Ausdrücken Compilertechniken Prozessanalyse Dynamische Analyse Datenanalyse Analyse- und Visualisierungstechniken Rigi Clustering Plagiatserkennung Refactoring Hot Spots Designmetriken ... Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
http://www.rigi.csc.uvic.ca/ Rigi ist DAS Reverse Engineering Visualisierungstool Rigi scales Performante Layouts Rigi Standard Format RSF Rigi Command Language Many "Fact Extractors" Many "Fact Users" Clones wie Shrimp Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Ziele Heute Nachtrag Visualisierungstool Rigi Clustering mit Bunch Poor Code Pattern Detection Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Clustering Gruppierung von Knoten mit dem Ziel: großer Zusammenhang im Cluster wenig Zusammenhang zwischen Clustern Anzahl möglicher Partitionierungen riesengroß Heuristiken Hill Climbing Simulated Anealing Genetische Algorithmen Interaktive Verfahren . . . Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Fachgebiet Software Engineering. Übersicht. © 27. 03 Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Fachgebiet Software Engineering. Übersicht. © 27. 03 Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
seeSoft CodeCrawler Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Tarantula Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Bunch Tool http://serg.cs.drexel.edu/projects/bunch/index.html http://www.graphviz.org/About.php Module Dependency Graph MDG: Zeilen mit a b aus rigi/Rigi/db/list-d/rsf erste Spalte löschen Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Poor Code Pattern Detection code smells, z.B.: jcosmo google findbugs anwenden auf eueren Parser Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Refactoring Editor-Makros für komplexe Umbauoperationen Restrukturierung von Programmen Semantik erhaltend Beispiele: Extract Method Push Up Method / Push Down Method Change Method Signature Extract Interface Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Probleme Extract Method: ersetze markierten Text durch Methode bestimme Ausschnitt aus den Kontrollstrukturen bestimme Parameter eventuell bestimme Rückgabewert Ablehnen bei mehreren Rückgabewerten Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University
Einordnung oft extrem praktisch sehr viele unterschiedliche Refactorings vorstellbar Challenge: identifiziere "häufige" Umbauoperationen Benutzer muss die kennen Fachgebiet Software Engineering Übersicht © 27.03.2017 Albert Zündorf, Kassel University