07.11.2013 Aufrufe

Vorlesung Software-Reengineering - Informatik - Universität Bremen

Vorlesung Software-Reengineering - Informatik - Universität Bremen

Vorlesung Software-Reengineering - Informatik - Universität Bremen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!