Vorlesung Software-Reengineering - Informatik - Universität Bremen
Vorlesung Software-Reengineering - Informatik - Universität Bremen
Vorlesung Software-Reengineering - Informatik - Universität Bremen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong><br />
Prof. Dr. R. Koschke 1 D. Simon 2<br />
1 Arbeitsgruppe <strong>Software</strong>technik<br />
Fachbereich Mathematik und <strong>Informatik</strong><br />
<strong>Universität</strong> <strong>Bremen</strong><br />
2 Institut für <strong>Software</strong> Technologie<br />
Fakultät <strong>Informatik</strong>, Elektrotechnik und Informationstechnologie<br />
<strong>Universität</strong> Stuttgart<br />
Oktober 2004
Überblick I<br />
1 Klonerkennung
echniken zur Klonerkennung<br />
Techniken zur Klonerkennung<br />
1 Klonerkennung<br />
Hintergrund<br />
Definitionen und Beispiele<br />
Ansätze zur Klonerkennung<br />
Verfahren nach Baker<br />
Verfahren nach Baxter<br />
Verfahren nach Mayrand et al.<br />
Vergleich von Techniken zur Klonerkennung<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 3 / 49
echniken zur Klonerkennung<br />
Klonerkennung<br />
• Lernziele<br />
• Varianten der Klonerkennung (Erkennung duplizierten Codes)<br />
• Bezug zu Abstraktionsebenen von Programmdarstellungen<br />
• Kontext<br />
• Beseitigung von Redundanz auf Codierungsebene<br />
• erleichtert nachfolgende <strong>Reengineering</strong>-Aktivitäten<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 4 / 49
echniken zur Klonerkennung<br />
Copy&Paste-Programmierung<br />
• Szenario 1:<br />
• Neue Funktionalität soll hinzugefügt, die ähnlich ist zu einer<br />
existierenden.<br />
• Auswirkungen sind nicht bekannt:<br />
• Wer benutzt die existierende Funktionalität bereits?<br />
• Was benutzt die existierende Funktionalität alles?<br />
• Häufige Folge: Funktion wird kopiert und leicht modifiziert.<br />
• Szenario 2:<br />
• Wegen unzureichender Versionskontrolle existieren mehrere Versionen<br />
derselben Funktion im selben Code oder in verschiedenen Systemen.<br />
• Szenario 3:<br />
• Programmiersprache unterstützt keine Vererbung und keine generischen<br />
Einheiten. Compiler bietet kein Inlining.<br />
• Folge: Code wird dupliziert<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 5 / 49
echniken zur Klonerkennung<br />
Folgen der Copy&Paste-Programmierung<br />
Die Folgen sind duplizierter Code und damit höherer Aufwand für<br />
Wartung, Verstehen und Test:<br />
• Schwierigere Fehlerkorrektur<br />
• Quelle subtiler Fehler<br />
• Höherer Aufwand beim Verstehen<br />
• Mehr Daten zu analysieren und visualisieren<br />
• Änderbarkeit leidet<br />
=⇒ Untersuchungen: 5–25 % Code sind redundant.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 6 / 49
echniken zur Klonerkennung<br />
Arten von Klonen<br />
Die Kopie eines Programmfragments wird Klon genannt.<br />
Typ 1 Exakte Kopie<br />
• Keinerlei Veränderung an der Kopie (bis auf White Space und<br />
Kommentaren).<br />
• Z.B. Inlining von Hand.<br />
Typ 2 Kopie mit Umbenennungen (parametrisierte Übereinstimmung)<br />
• Bezeichner werden in der Kopie umbenannt.<br />
• Z.B. ”<br />
Wiederverwendung“ einer Funktion, generische Funktion<br />
von Hand<br />
Typ 3 Kopie mit weiteren Modifikationen<br />
• Code der Kopie wird abgeändert, nicht nur Bezeichner.<br />
• Z.B. ”<br />
Erweiterung“ einer Funktion.<br />
Typ 4 Semantische Klone<br />
• Verschiedene Implementierungen desselben Konzepts.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 7 / 49
echniken zur Klonerkennung<br />
Beispiele<br />
i = l e n g t h ( l ) ;<br />
i f ( i < 3) { . . . }<br />
i = l e n g t h ( l ) ;<br />
i f ( i < 3) { . . . }<br />
i = l e n g t h ( l ) ;<br />
i f ( i < 3) { . . . }<br />
i = l e n g t h ( l ) ;<br />
i f ( i < 3) { . . . }<br />
i = l e n g t h ( l ) ;<br />
i f ( i < 3) { . . . }<br />
k = l e n g t h ( j ) ;<br />
i f ( k < x ) { . . . }<br />
k = l e n g t h ( j ) ;<br />
i f ( j < 3) { . . . }<br />
k = l e n g t h ( j ) ;<br />
f ( ) ;<br />
i f ( k < x ) { . . . }<br />
Typ 1<br />
Typ 2<br />
zwei Typ 2 bzw. ein Typ 2 mit<br />
inkonsistenter Umbenennung<br />
Typ 3<br />
x = x + 1 ; x++; primitiver Typ 4<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 9 / 49
echniken zur Klonerkennung<br />
Granularität der Klone<br />
Das Ziel der Klonerkennung bestimmt Granularität. Je feiner die<br />
Granularität, desto höher der Aufwand.<br />
• Sequenzen von Anweisungen<br />
• Beseitigung von manuellem Inlining.<br />
• Kapselung von Operationen in Unterprogrammen.<br />
• Unterprogramme und Datenstrukturen<br />
• Identifikation von Kandidaten für die Einführung generischer Konzepte.<br />
• Vereinigung von Varianten.<br />
• ”<br />
Objektifizierung“<br />
• Pakete<br />
• Wie oben, jedoch im größeren Stil.<br />
• Säuberung nach gescheiterter Versionskontrolle.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 10 / 49
echniken zur Klonerkennung<br />
Ansätze zur Klonerkennung<br />
Die Ansätze unterscheiden sich in<br />
• Granularität des berücksichtigten Wissens<br />
• Anweisungssequenzen<br />
• Funktionen<br />
• Pakete<br />
• und der Abstraktionsebene der Analyse<br />
• Text<br />
• Token-Ebene<br />
• Syntax<br />
• quantifizierbare Merkmale<br />
• Semantik<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 11 / 49
echniken zur Klonerkennung<br />
Existierende Ansätze<br />
• Anzahl unterschiedlicher Zeilen des Unix-Diff-Programmes<br />
• Pattern Matching auf Ebene der Lexeme (Baker)<br />
• Matching auf dem abstrakten Syntaxbaum (Baxter et al.)<br />
• Vergleich quantifizierter Merkmale (Metriken) des Codes (Mayrand et<br />
al.)<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 12 / 49
echniken zur Klonerkennung<br />
Probleme bei der Erkennung<br />
• Jede Zeile/Funktion/Datei muss mit jeder anderen<br />
Zeile/Funktion/Datei verglichen werden:<br />
• Wie kann quadratischer Aufwand vermieden werden?<br />
• Wie kann von Bezeichnern geeignet abstrahiert werden?<br />
• Soll die Umbenennung konsistent sein?<br />
• Typ 3 Klone: Geklonte Codefragmente können zu größeren Klonen<br />
zusammengefasst werden.<br />
• Codefragmente müssen nicht direkt zusammenhängend sein.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 13 / 49
echniken zur Klonerkennung<br />
Verfahren nach Baker<br />
• Verfahren basiert auf Lexemen.<br />
• Vermeidung des quadratischen Aufwands:<br />
• quasi-parallele Suche in einer Programmrepräsentation, die jedes<br />
mögliche Anfangsstück des Programms enthält.<br />
• Abstraktion von Bezeichnern:<br />
• Bezeichner werden auf relative Positionen abgebildet.<br />
• Typ 3 Klone:<br />
• Separater Schritt am Ende<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 14 / 49
echniken zur Klonerkennung<br />
Parameter-String<br />
• Für jede Codezeile wird eine Zeichenkette aus Parametersymbolen<br />
und Nichtparametersymbolen generiert (so genannter<br />
Parameter-String oder P-String):<br />
• Struktur der Zeile wird auf eindeutiges Nichtparametersymbol<br />
abgebildet (Funktor)<br />
• Bezeichner werden in Argumentliste erfasst<br />
• Ergebnis ist: (Funktor Argumentliste)<br />
• Beispiel: x = x + y → (P = P + P; x,x,y) → α x x y<br />
• Die Konkatenation der P-Strings aller Codezeilen repräsentiert das<br />
Programm.<br />
j = l e n g t h ( l ) ;<br />
i f ( j < 3) {x = x + y ; }<br />
→ α j length l β j 3 x x y<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 15 / 49
echniken zur Klonerkennung<br />
Prev-String<br />
• Kodierung prev(s) jedes P-Strings s:<br />
• Erstes Vorkommen eines Bezeichners erhält Nummer 0.<br />
• Jedes weitere Vorkommen erhält den relativen Abstand zum vorherigen<br />
Vorkommen (Funktoren mitgezählt).<br />
• Beispiel:<br />
α j length l β j 3 x x y<br />
→ α 0 0 0 β 4 0 0 1 0<br />
• Abstraktion der Bezeichner, jedoch nicht ihrer Reihenfolge.<br />
• S ist ein P-Match von T genau dann, wenn prev(S) = prev(T )<br />
• Beispiel: x = x + y und a = a + b sind ein P-Match wegen<br />
γ010 = γ010<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 16 / 49
echniken zur Klonerkennung<br />
P-Suffix-Baum I<br />
• Sei S i = s i s i+1 . . . s n $ das i’te Suffix von S ($ ist das Endezeichen).<br />
Der P-Suffix-Baum von S enthält alle prev(S i ) zu den Suffixen des<br />
P-Strings S.<br />
Beispiel: S = αyβyαxαx<br />
prev(S 1 ) = α0β2α0α2$<br />
prev(S 2 ) = 0β2α0α2$<br />
prev(S 3 ) = β0α0α2$<br />
prev(S 4 ) = 0α0α2$<br />
prev(S 5 ) = α0α2$<br />
prev(S 6 ) = 0α2$<br />
prev(S 7 ) = α0$<br />
prev(S 8 ) = 0$<br />
prev(S 9 ) = $<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 17 / 49
echniken zur Klonerkennung<br />
P-Suffix-Baum II<br />
• Klone lassen sich im Baum durch Verzweigungen identifizieren.<br />
(Benutzer legt die Mindestzeilenlänge der Klone fest; entspricht der<br />
Anzahl von Funktoren).<br />
• Gefundene P-Matches werden, wenn möglich, zusammengefasst:<br />
• Modi:<br />
• nur wenn d 1 = d 2<br />
• wenn max(d 1 , d 2 ) ≤ Θ<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 18 / 49
echniken zur Klonerkennung<br />
Bewertung des Ansatzes von Baker I<br />
• Bakers Klonerkennung ist lexem-basiert und damit sehr schnell:<br />
• Plattform: SGI IRIX 4.1, 40 Mhz R3000, 256 MB Hauptspeicher<br />
• System: 1,1 Mio LOC, mindestens zusammenhängende 30 LOC/Klon<br />
• nur 7 Minuten Analysezeit<br />
• Der Ansatz ist invariant gegen Einfügung von Leerzeichen, Leerzeilen<br />
und Kommentaren.<br />
• Der Ansatz ist weitgehend programmiersprachen-unabhängig (nur<br />
Regeln für Bezeichner/Tokens notwendig).<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 19 / 49
echniken zur Klonerkennung<br />
Bewertung des Ansatzes von Baker II<br />
Allerdings entgehen dem Ansatz:<br />
• äquivalente Ausdrücke mit kommutativen Operatoren:<br />
x = x + y x = y + x<br />
• gleiche Anweisungsfolgen, die verschieden umgebrochen wurden:<br />
if (a > 1) {x = 1;} if (a > 1)<br />
{x = 1;}<br />
• gleiche Teilausdrücke:<br />
if (sp > 0) if (sp > 0 && s[sp] != a)<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 20 / 49
echniken zur Klonerkennung<br />
AST-Matching<br />
Ansatz basierend auf abstrakten Syntaxbäumen (ASTs):<br />
• vergleiche jeden Teilbaum mit jedem anderen Teilbaum auf Gleichheit<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 21 / 49
echniken zur Klonerkennung<br />
Verfahren nach Baxter<br />
• Verfahren basiert auf ASTs<br />
• Vermeidung des quadratischen Aufwands:<br />
• Partitionierung der zu vergleichenden Bäumen.<br />
• Abstraktion von Bezeichnern:<br />
• Partitionierung und AST-Vergleich ignoriert Bezeichner.<br />
• Typ 3 Klone:<br />
• Vergleich auf Ähnlichkeit statt Gleichheit.<br />
• Separater Schritt am Ende.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 22 / 49
echniken zur Klonerkennung<br />
Skalierungsproblem und Erkennung der Klontypen I<br />
• Bäume werden durch Hash-Funktion partitioniert.<br />
• Nur Bäume innerhalb einer gemeinsamen Partition werden verglichen.<br />
• Hash-Funktion gleich wie bei Erkennung von gemeinsamen<br />
Teilausdrücken durch optimierende Compiler:<br />
h : nodetype × arg 1 × arg 2 × . . . × arg n → integer<br />
• Typ 1 Klonerkennung: h liefert genaue Partitionierung<br />
• Typ 2/3 Klonerkennung: h ignoriert Bezeichner<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 23 / 49
echniken zur Klonerkennung<br />
Skalierungsproblem und Erkennung der Klontypen II<br />
• Bäume werden auf Ähnlichkeit verglichen (nicht auf Gleichheit):<br />
Similarity(T 1 , T 2 ) =<br />
2 · Same(T 1 , T 2 )<br />
2 · Same(T 1 , T 2 ) + Difference(T 1 , T 2 )<br />
• Similarity muss über benutzerdefiniertem Schwellwert Θ S liegen:<br />
Similarity(T 1 , T 2 ) ≥ Θ S<br />
• Nur Bäume T mit mass(T ) ≥ Θ m werden betrachtet<br />
(mass = Anzahl von Knoten, Θ m = benutzerdefinierter Schwellwert).<br />
• Bei kommutativen Operatoren werden wechselseitig beide Teilbäume<br />
verglichen.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 24 / 49
echniken zur Klonerkennung<br />
Probleme (und Lösungen) des AST-Matchings<br />
• Skalierung<br />
• Vermeidung unnötiger Vergleiche<br />
• Nicht nur Typ 1 Klone sollen erkannt werden.<br />
• Abstraktion von Bezeichnern.<br />
• Die Teilausdrücke müssen nicht gleich sein, sondern nur ähnlich genug.<br />
• Klone sind Teil anderer Klone (geschachtelte Konstrukte).<br />
• Klone, die Teil eines anderen Klons sind, werden ignoriert, d.h.<br />
zusammengesetzte Klone subsumieren ihre Teile.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 25 / 49
echniken zur Klonerkennung<br />
Basis-AST-Matching (Schritt 1)<br />
C l o n e s := ∅ ;<br />
f o r each s u b t r e e t l o o p<br />
i f mass ( t ) ≥ Θ m then<br />
hash t to bucket ;<br />
end i f ;<br />
end l o o p ;<br />
f o r each s u b t r e e s and t i n the same bucket l o o p<br />
i f S i m i l a r i t y ( s , t ) ≥ Θ S then<br />
f o r each s u b t r e e s ’ o f s and f o r each s u b t r e e t ’ o f t<br />
and Is Member ( s ’ , t ’ , C l o n e s )<br />
l o o p<br />
Remove Clone Pair ( s ’ , t ’ , C l o n e s ) ;<br />
end l o o p ;<br />
A d d C l o n e P a i r ( s , t , C l o n e s ) ;<br />
end i f ;<br />
end l o o p ;<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 27 / 49
echniken zur Klonerkennung<br />
AST-Matching von Sequenzen (Schritt 2)<br />
• Sequenzen von Bäumen (z.B. Anweisungsfolgen):<br />
v o i d f ( v o i d )<br />
{<br />
x = 0 ;<br />
a = a + 1 ;<br />
b = b + 2 ;<br />
c = c + 3 ;<br />
w = g ( ) ;<br />
}<br />
v o i d g ( v o i d )<br />
{<br />
y = 2 ∗ x ;<br />
a = a + 1 ;<br />
b = b + 2 ;<br />
c = c + 3 ;<br />
i = h ( ) ∗ 3 ;<br />
}<br />
• Basis-Matching-Algorithmus identifiziert nur die gleichen<br />
Zuweisungen, ignoriert aber Gleichheit der beiden<br />
Anweisungsteilfolgen als Ganzes.<br />
• Nächster Schritt identifiziert maximal lange gemeinsame Teilfolgen<br />
zweier Sequenzen, mit einer benutzerdefinierten Mindestlänge.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 28 / 49
echniken zur Klonerkennung<br />
Erkennung von Klonsequenzen (Schritt 2)<br />
f o r k i n Min Length . . Max Length l o o p<br />
p l a c e a l l s u b s e q u e n c e s o f l e n g t h k i n t o b u c k e t s ;<br />
f o r each s u b s e q u e n c e i and j i n same bucket l o o p<br />
i f Compare Sequence ( i , j , k ) ≥ Θ S then<br />
Remove Sequence Subclones Of ( i , j , k , C l o n e s ) ;<br />
A d d S e q u e n c e C l o n e P a i r ( i , j , k , C l o n e s ) ;<br />
end i f ;<br />
end l o o p ;<br />
end l o o p ;<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 30 / 49
echniken zur Klonerkennung<br />
Erkennung zusammengesetzter Klone (Schritt 3)<br />
• Gemeinsame Anweisungsfolgen wurden möglicherweise erst im<br />
zweiten Schritt nach dem Basis-AST-Matching erkannt.<br />
• Durch neu erkannte Klone könnten Konstrukte, die diese Klone<br />
umfassen, nunmehr doch ähnlich sein.<br />
s = 0 ; x = y ;<br />
w h i l e ( x > 0) {<br />
s = s + x ;<br />
x = x − 1 ;<br />
. . .<br />
}<br />
p = 0 ; a = b ;<br />
w h i l e ( a > 0) {<br />
p = p ∗ x ;<br />
a = a − 1 ;<br />
. . .<br />
}<br />
• D.h. Vaterknoten der als Klone erkannten Teilbäume müssen noch<br />
einmal evaluiert werden.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 31 / 49
echniken zur Klonerkennung<br />
Erkennung zusammengesetzter Klone (Schritt 3)<br />
C l o n e s T o G e n e r a l i z e := C l o n e s ;<br />
w h i l e C l o n e s T o G e n e r a l i z e ≠ ∅ l o o p<br />
Remove Clone Pair ( s , t , C l o n e s T o G e n e r a l i z e ) ;<br />
i f Compare Clones ( Parent ( s ) , Parent ( t ) ) ≥ Θ S then<br />
Remove Clone Pair ( s , t , C l o n e s ) ;<br />
A d d C l o n e P a i r ( Parent ( s ) , Parent ( t ) , C l o n e s ) ;<br />
A d d C l o n e P a i r ( Parent ( s ) , Parent ( t ) ,<br />
C l o n e s T o G e n e r a l i z e ) ;<br />
end i f ;<br />
end l o o p ;<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 33 / 49
echniken zur Klonerkennung<br />
Bewertung des Ansatzes von Baxter<br />
• AST-Matching ist syntax-orientiert und deshalb aufwändiger als<br />
lexem-basierter Ansatz, da Parsing notwendig ist<br />
• beim lexem-basierten Ansatz müssen nur Schlüsselworte und<br />
Trennzeichen erkannt werden<br />
• was aber bei manchen Programmiersprachen eben doch Parsing<br />
voraussetzt, z.B. PL/1:<br />
IF IF = ELSE THEN ELSE := THEN ELSE IF := ELSE<br />
• dafür aber genauer:<br />
• kommutative Operatoren werden berücksichtigt<br />
• syntaktische Einheiten werden verglichen, statt einzelner Code-Zeilen<br />
• übereinstimmende Teilausdrücke werden erkannt<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 34 / 49
echniken zur Klonerkennung<br />
Verfahren nach Mayrand et al.<br />
• Verfahren basiert auf Metriken des Codes.<br />
• Vermeidung des quadratischen Aufwands:<br />
• im Prinzip immer noch quadratisch, Vergleich ist aber relativ billig.<br />
• Abstraktion von Bezeichnern:<br />
• Bezeichner werden von Metriken ignoriert.<br />
• Typ 3 Klone:<br />
• durch Toleranz der Metriken bzw. ihrer Zusammenfassung.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 35 / 49
echniken zur Klonerkennung<br />
Vergleich auf Basis von Kennzahlen<br />
• Hoffnung:<br />
Code 1 = Code 2 ⇔ Kennzahlen(Code 1 ) = Kennzahlen(Code 2 )<br />
• Granularität üblicherweise Funktionsebene, da hierfür viele Metriken<br />
existieren<br />
• Aspekte (nach Mayrand et al.):<br />
• Namen<br />
• Layout<br />
• Anweisungen<br />
• Kontrollfluss<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 36 / 49
echniken zur Klonerkennung<br />
Vergleichsmetriken (Mayrand et al.)<br />
• Name<br />
• relative Anzahl gemeinsamer Zeichen<br />
• Layout<br />
• Anzahl Zeichen von Kommentaren (Deklarationsteil,<br />
Implementierungsteil)<br />
• Anzahl mehrzeiliger Kommentare<br />
• Anzahl nicht-leerer Zeilen (inklusive Kommentare)<br />
• durchschnittliche Länge der Bezeichner<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 37 / 49
echniken zur Klonerkennung<br />
Vergleichsmetriken (Mayrand et al.)<br />
• Anweisungen<br />
• gesamte Anzahl von Funktionsaufrufen<br />
• Anzahl verschiedener Aufrufe<br />
• durchschnittliche Komplexität der Entscheidungen in der Funktion<br />
• Anzahl der Deklarationen<br />
• Anzahl ausführbarer Anweisungen<br />
• Kontrollfluss<br />
• Anzahl der Kanten im Kontrollflussgraphen (KFG)<br />
• Anzahl der Knoten im KFG<br />
• Anzahl der Bedingungen im KFG<br />
• Anzahl der Pfade im KFG<br />
• Komplexitätsmetrik über dem KFG<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 38 / 49
echniken zur Klonerkennung<br />
Zusammenfassung der Metriken<br />
• Zwei Funktionen f 1 und f 2 sind in Bezug auf einen Aspekt:<br />
gleich gleiche Metrikwerte<br />
ähnlich alle Metrikwerte liegen in einer gewissen Bandbreite<br />
(spezifisch für jede individuelle Kennzahl definiert), sind<br />
aber nicht gleich<br />
verschieden mindestens ein Metrikwert liegt außerhalb einer<br />
Bandbreite<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 39 / 49
echniken zur Klonerkennung<br />
Klassifikation<br />
Exakte Kopie Funktionen sind in jedem Aspekt gleich (Typ 1 Klon)<br />
Ähnliches Layout Ähnliches Layout und ähnliche Namen, gleiche<br />
Anweisungen und Kontrollfluss (≈ Typ 2 Klon)<br />
Ähnliche Ausdrücke Name und Layout sind verschieden, Anweisungen und<br />
Kontrollfluss sind gleich (≈ Typ 2 Klon)<br />
Verschieden Alle Aspekte sind verschieden.<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 40 / 49
echniken zur Klonerkennung<br />
Bewertung des Ansatzes von Mayrand et al.<br />
• Aspekte sind nicht unabhängig.<br />
• Definition der Bandbreite ist notwendig.<br />
• Klassifikation ist unvollständig.<br />
• Präzision:<br />
• Code 1 = Code 2 ⇒ Kennzahlen(Code 1 ) = Kennzahlen(Code 2 ) √<br />
• Code 1 ≈ Code 2 ⇒ Kennzahlen(Code 1 ) ≈ Kennzahlen(Code 2 ) √<br />
• Kennzahlen(Code 1 ) = Kennzahlen(Code 2 ) ⇒ Code 1 = Code 2 ?<br />
• Kennzahlen(Code 1 ) ≈ Kennzahlen(Code 2 ) ⇒ Code 1 ≈ Code 2 ???<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 41 / 49
echniken zur Klonerkennung<br />
Vergleich von Techniken zur Klonerkennung<br />
Teilnehmer<br />
Brenda S. Baker<br />
Ira D. Baxter<br />
Toshihiro Kamiya<br />
Jens Krinke<br />
Ettore Merlo<br />
Matthias Rieger<br />
Ansatz<br />
Suffix-Tree, tokenbasiert<br />
Subtree-Matching im AST<br />
Eingabetransformation, tokenbasiert<br />
Program Dependence Graph<br />
Funktions-Metriken<br />
Pattern Matching auf visualisiertem Code<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 42 / 49
echniken zur Klonerkennung<br />
Untersuchte <strong>Software</strong>-Systeme<br />
Projekt Sprache Größe Kandidaten Referenzen<br />
(SLOC)<br />
weltab C 11K 13901 252<br />
cook C 80K 27122 402<br />
snns C 115K 66331 903<br />
postgresql C 235K 59114 555<br />
netbeans-javadoc Java 19K 7860 55<br />
eclipse-ant Java 35K 2440 30<br />
eclipse-jdtcore Java 148K 92905 1345<br />
j2sdk1.4.0-javax-swing Java 204K 56262 777<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 43 / 49
echniken zur Klonerkennung<br />
Beispiel SNNS: Kandidaten<br />
20000<br />
15000<br />
18961 18923<br />
Typ 3<br />
Typ 2<br />
Typ 1<br />
unbestimmt<br />
12181<br />
10000<br />
8978<br />
5000<br />
5212<br />
0<br />
903<br />
1434<br />
Orakel Baker Baxter Kamiya Kamiya<br />
(vol.)<br />
318 324<br />
Krinke Merlo Merlo<br />
(vol.)<br />
Rieger<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 44 / 49
echniken zur Klonerkennung<br />
Beispiel SNNS: Gefundene Referenzen<br />
1000<br />
800<br />
903 903<br />
812 812<br />
Typ 3<br />
Typ 2<br />
Typ 1<br />
600<br />
601 601<br />
497<br />
400<br />
369<br />
302<br />
200<br />
0<br />
223<br />
180<br />
135<br />
78<br />
100<br />
48 44 49 45<br />
OK Good OK Good OK OK OK OK OK OK OK<br />
Good Good Good Good Good Good Good<br />
Orakel Baker Baxter Kamiya Kamiya<br />
(vol.)<br />
Krinke Merlo Merlo<br />
(vol.)<br />
Rieger<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 45 / 49
echniken zur Klonerkennung<br />
Beispiel SNNS: Recall und Precision<br />
0.9<br />
0.8<br />
0.7<br />
0.6<br />
0.5<br />
0.4<br />
0.3<br />
0.2<br />
0.1<br />
0<br />
0.33<br />
0.65<br />
0.39<br />
0.05<br />
0.09<br />
0.37<br />
0.07<br />
0<br />
0.84 0.84 0.84 0.84<br />
0.67 0.67<br />
0.19 0.19<br />
Baker Baxter Kamiya Kamiya<br />
(vol.)<br />
0.11<br />
0.03<br />
0.02<br />
0.36<br />
0.09 0.09<br />
0.05 0.05 0.05 0.05<br />
0.02 0.03<br />
Krinke Merlo Merlo<br />
(vol.)<br />
0.56<br />
0.2<br />
0.18<br />
0.07<br />
Rieger<br />
Typ 3<br />
Typ 2<br />
Typ 1<br />
insgesamt<br />
0.9<br />
0.8<br />
0.7<br />
0.6<br />
0.5<br />
0.4<br />
0.3<br />
0.2<br />
0.1<br />
0<br />
0.808<br />
0.067<br />
0.054<br />
0.034 0.027 0.026<br />
0.032 0.032<br />
Baker Baxter Kamiya Kamiya<br />
(vol.)<br />
0.008<br />
0.007<br />
0.192 0.192<br />
0.1380.135 0.1390.135<br />
0.054 0.061<br />
Krinke Merlo Merlo<br />
(vol.)<br />
0.035<br />
Rieger<br />
Typ 3<br />
Typ 2<br />
Typ 1<br />
insgesamt<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 46 / 49
echniken zur Klonerkennung<br />
Zusammenfassung<br />
Baker Baxter Kamiya Krinke Merlo Rieger<br />
Ansatz Token AST Token PDG Metrik Token<br />
Erkennt Typ 1, 2 1, 2 1, 2, 3 3 1, 2, 3 1, 2, 3<br />
Klassifiziert 1, 2 1, 2 – 3 1, 2, 3 –<br />
Geschwind. + + - + - - + + ?<br />
Speicher + - + + + + ?<br />
Recall + - + - - +<br />
Precision - + - - + -<br />
Versteckte 42 % 28 % 46 % 4 % 24 % 31 %<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 47 / 49
echniken zur Klonerkennung<br />
Baumöl u. a. 1996 Baumöl, Ulrike ; Borchers, Jens ; Eicker,<br />
Stefan ; Hildebrand, Knut ; Jung, Reinhard ; Lehner, Franz:<br />
Einordnung und Terminologie des <strong>Software</strong> <strong>Reengineering</strong>. In:<br />
<strong>Informatik</strong> Spektrum 19 (1996), S. 191–195<br />
Chikofsky und Cross II. 1990 Chikofsky, Elliot J. ; Cross II.,<br />
James H.: Reverse Engineering and Design Recovery: A Taxonomy. In:<br />
IEEE <strong>Software</strong> 7 (1990), Januar, Nr. 1, S. 13–17<br />
Cytron u. a. 1991 Cytron, Ron ; Ferrante, Jeanne ; Rosen,<br />
Barry K. ; Wegman, Mark N. ; Zadeck, F. K.: Efficiently Computing<br />
Static Single Assignment Form and the Control Dependence Graph. In:<br />
ACM Transactions on Programming Languages and Systems 13 (1991),<br />
Oktober, Nr. 4, S. 451–490<br />
Koschke u. a. 1998 Koschke, Rainer ; Girard, Jean-François ;<br />
Würthner, Martin: An Intermediate Representation for Reverse<br />
Engineering Analyses. In: Proceedings of the 5th Working Conference<br />
on Reverse Engineering. Honolulu, HI, USA : IEEE Computer Society<br />
Press, Oktober 1998, S. 241–250<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 48 / 49
echniken zur Klonerkennung<br />
Morgan 1998 Morgan, Robert: Building an Optimizing Compiler.<br />
Digital Press, 1998<br />
Koschke/Simon (Univ. <strong>Bremen</strong>/Stuttgart) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2004/2005 49 / 49