Post on 05-Apr-2015
transcript
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 1
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 © 11.04.23 Albert Zündorf, Kassel University 2
Motivation
Aufgaben:
Wiedergewinnung von Design(Klassendiagramme, ...)
Finden von Funktionalität
Finden von Fehlerursachen
(Benutzt viele Compilertechniken)
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 3
Inhalt
1. Volltextsuchtechniken (grep, google, find, ...)
2. Compiler basierte Techniken (Cross-Referencing, ...)
3. Dynamische Analysen
1. Code Instrumentierung / Tracing
2. Debugger Techniken
4. Analyse der Versionshistorie
5. Auswertung und Visualisierung (Clustering, ...)
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 4
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 © 11.04.23 Albert Zündorf, Kassel University 5
Suchen in IDEs (Eclipse)
Edit -> Find(Ctrl-F)
• suchen in aktueller Datei
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 6
Suchen in IDEs (Eclipse)
• suchen in allen Dateien des Projekts
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 7
4. Suchen:
1. TODO
2. Edit class dialog
3. File Save As Implementierung
4. Unterklassen von UMLDiagram
5. Fehlermeldung:
1. Unnamed class diagram
2. log4j: ERROR setFile(null,true) call failed.
3. CFG-parse error during code generation for NewClass::m1-> Abnormal termination in control flow
4. java.lang.RuntimeException: Transition guards null and null are incompatible
6. Alle anwendenden Vorkommen von getName() der Klasse UMLClass
7. Wo wird "public" Flag für Klassen in der Codegenerierung erzeugt
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 8
Aufgaben zur Volltextsuche:
4. Suchen:
....
6. Alle anwendenden Vorkommen von getName() der Klasse UMLClass
Compilertechniken notwendig(nächste Woche)
Die war gemein
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 9
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 © 11.04.23 Albert Zündorf, Kassel University 10
JavaDoc zu File: /**
* 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 © 11.04.23 Albert Zündorf, Kassel University 11
Einsatz von Compilertechniken:
Symboltabellen
Cross Referencing
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 12
Erweiterte Symboltabelle
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 13
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 14
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 © 11.04.23 Albert Zündorf, Kassel University 15
Compilerbau Nachlese
reguläre Ausdrücke: einfach aber ungenau
Compilerbau: 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 © 11.04.23 Albert Zündorf, Kassel University 16
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 © 11.04.23 Albert Zündorf, Kassel University 17
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 © 11.04.23 Albert Zündorf, Kassel University 18
Übersicht1. Quelltextanalyse mit regulären Ausdrücken
2. Compilertechniken
3. Prozessanalyse
4. Dynamische Analyse
5. Datenanalyse
6. Design Pattern Erkennung
7. Analyse- und Visualisierungstechniken
1. Clustering
2. Plagiatserkennung
3. Refactoring
4. Hot Spots
5. Designmetriken
6. ...
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 19
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 © 11.04.23 Albert Zündorf, Kassel University 20
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 © 11.04.23 Albert Zündorf, Kassel University 21
Übersicht
1. Quelltextanalyse mit regulären Ausdrücken
2. Compilertechniken
3. Prozessanalyse
4. Dynamische Analyse
5. Datenanalyse
6. Design Pattern Erkennung
7. Analyse- und Visualisierungstechniken
1. Clustering
2. Plagiatserkennung
3. Refactoring
4. Hot Spots
5. Designmetriken
6. ...
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 22
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 © 11.04.23 Albert Zündorf, Kassel University 23
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 © 11.04.23 Albert Zündorf, Kassel University 24
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 © 11.04.23 Albert Zündorf, Kassel University 25
Profiler
statistische Auswertung zeilengenauer Traces
DAS Mittel zur Effizienzsteigerung
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 26
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 © 11.04.23 Albert Zündorf, Kassel University 27
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 © 11.04.23 Albert Zündorf, Kassel University 28
Graphische Darstellung von Laufzeitdaten
Datenlog Browser: Object Flipbook
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 29
Design Pattern
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 30
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 © 11.04.23 Albert Zündorf, Kassel University 31
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 © 11.04.23 Albert Zündorf, Kassel University 32
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 © 11.04.23 Albert Zündorf, Kassel University 33
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 © 11.04.23 Albert Zündorf, Kassel University 34
Design Pattern Erkennung Probleme Performance:
Parserbaum für Gesamtprogramm meist zu groß, dauert ewiglazy 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 © 11.04.23 Albert Zündorf, Kassel University 35
Übersicht1. Quelltextanalyse mit regulären Ausdrücken
2. Compilertechniken
3. Prozessanalyse
4. Dynamische Analyse
5. Datenanalyse
6. Analyse- und Visualisierungstechniken
1. Rigi
2. Clustering
3. Plagiatserkennung
4. Refactoring
5. Hot Spots
6. Designmetriken
7. ...
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 36
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 © 11.04.23 Albert Zündorf, Kassel University 37
Ziele Heute
Nachtrag Visualisierungstool Rigi
Clustering mit Bunch
Poor Code Pattern Detection
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 38
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 © 11.04.23 Albert Zündorf, Kassel University 39
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 40
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 41
seeSoft CodeCrawler
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 42
Tarantula
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 43
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 © 11.04.23 Albert Zündorf, Kassel University 44
Poor Code Pattern Detection
code smells, z.B.: jcosmo
google findbugs
anwenden auf eueren Parser
Fachgebiet Software Engineering Übersicht © 11.04.23 Albert Zündorf, Kassel University 45
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 © 11.04.23 Albert Zündorf, Kassel University 46
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 © 11.04.23 Albert Zündorf, Kassel University 47
Einordnung
oft extrem praktisch
sehr viele unterschiedliche Refactorings vorstellbar
Challenge: identifiziere "häufige" Umbauoperationen Benutzer muss die kennen