Vorlesung Software-Reengineering - Informatik - Universität Bremen
Vorlesung Software-Reengineering - Informatik - Universität Bremen
Vorlesung Software-Reengineering - Informatik - Universität Bremen
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong><br />
Prof. Dr. Rainer Koschke<br />
Arbeitsgruppe <strong>Software</strong>technik<br />
Fachbereich Mathematik und <strong>Informatik</strong><br />
<strong>Universität</strong> <strong>Bremen</strong><br />
Wintersemester 2009/10
Überblick I<br />
1 Klonerkennung
Techniken zur Klonerkennung<br />
Techniken zur Klonerkennung I<br />
1 Klonerkennung<br />
Hintergrund<br />
Folgen<br />
Übersicht zu den Ansätzen zur Klonerkennung<br />
Textuelle Verfahren<br />
Lexikalische Verfahren<br />
Metrikbasierte Verfahren<br />
Syntaxbasierte Verfahren<br />
PDG-basierte Verfahren<br />
Lexikalische Verfahren<br />
Syntaxbasierte Verfahren<br />
Metrikbasierte Verfahren<br />
Vergleich von Techniken zur Klonerkennung<br />
Wiederholungsfragen<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 3 / 63
Techniken zur Klonerkennung<br />
No two parts are alike in software. . .<br />
<strong>Software</strong> entities are more complex for their size than perhaps<br />
any other human construct because no two parts are alike (at<br />
least above the statement level). If they are, we make the two<br />
similar parts into a subroutine — open or closed. In this<br />
respect, software systems differ profoundly from computers,<br />
buildings, or automobiles, where repeated elements abound.<br />
– by Frederick P. Brooks, Jr: No Silver Bullet: Essence and Accidents of<br />
<strong>Software</strong> Engineering<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 6 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 10 / 63
Techniken zur Klonerkennung<br />
<strong>Software</strong>redundanz<br />
Duplikation von Quelltext durch Copy&Paste (Code Cloning) ist häufig:<br />
Nummer 1 auf Beck und Fowlers ” Stink Parade of Bad Smells“<br />
Forschung:<br />
% System Zeilen Referenz<br />
19 X Windows ≥ 30 Baker (1995)<br />
28 3 subs. of process-control sys. ? Baxter u. a. (1998)<br />
59 payroll system ≥ 10 Ducasse u. a. (1999)<br />
Klone länger als 25 Zeilen sind selten (Baxter u. a. 1998)<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 11 / 63
Techniken zur Klonerkennung<br />
Klontypen: Typ 1<br />
PRIVATE UINT16 t y p l e n g t h ( a t n t y p e ∗node )<br />
{ i f ( node−>tag == REF )<br />
node = node−>t r e e . r e f t y p e ;<br />
s w i t c h ( node−>tag )<br />
{<br />
c a s e INTEGER : r e t u r n 4 ;<br />
c a s e REAL : r e t u r n 8 ;<br />
c a s e BOOLEAN : r e t u r n 1 ;<br />
c a s e STRING : r e t u r n 4 ;<br />
c a s e ARRAY :<br />
r e t u r n t y p l e n g t h ( node−>t r e e . a r r a y . t y p e )<br />
∗ ( node−>t r e e . a r r a y . upb<br />
− node−>t r e e . a r r a y . lwb +1);<br />
c a s e REF : r e t u r n 4 ;<br />
d e f a u l t :<br />
l o g e r r o r (ERR FATAL , SYSTEM ERROR,<br />
E ILLEGAL TAG , ” t y p e ” , 0 ) ;<br />
}<br />
r e t u r n 0 ;<br />
}<br />
1 PRIVATE UINT16 t y p l e n g t h ( a t n t y p e ∗node )<br />
2 { i f ( node−>tag == REF )<br />
3 node = node−>t r e e . r e f t y p e ;<br />
4<br />
5 s w i t c h ( node−>tag )<br />
6 {<br />
7 c a s e INTEGER : r e t u r n 4 ;<br />
8 c a s e REAL : r e t u r n 8 ;<br />
9 c a s e BOOLEAN : r e t u r n 1 ;<br />
10 c a s e STRING : r e t u r n 4 ;<br />
11 c a s e ARRAY :<br />
12 r e t u r n t y p l e n g t h ( node−>t r e e . a r r a y . t y p e )<br />
13 ∗ ( node−>t r e e . a r r a y . upb<br />
14 − node−>t r e e . a r r a y . lwb +1);<br />
15 c a s e REF : r e t u r n 4 ;<br />
16 d e f a u l t :<br />
17 l o g e r r o r (ERR FATAL , SYSTEM ERROR,<br />
18 E ILLEGAL TAG , ” t y p e ” , 0 ) ;<br />
19 }<br />
20 r e t u r n 0 ;<br />
21 }<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 12 / 63
Techniken zur Klonerkennung<br />
Klontypen: Typ 2<br />
}<br />
r e t u r n TRUE ;<br />
/∗ r e a d operand #0 ( a l w a y s p r e s e n t ) ∗/<br />
thisOp−>op [ 0 ] . t y p e<br />
= v a a r g ( ap , a 3 a r g u m e n t t y p e ) ;<br />
i f ( ( thisOp−>op [ 0 ] . t y p e == oCFLOAT ) | |<br />
( thisOp−>op [ 0 ] . t y p e & 1 6 ) ) // i n d e x e d<br />
{<br />
thisOp−>op [ 0 ] . v a l . f [0]= v a a r g ( ap , INT32 ) ; 11 thisOp−>op [ 2 ] . v a l . f [0]= v a a r g ( ap , INT32 ) ;<br />
}<br />
e l s e<br />
thisOp−>op [ 0 ] . v a l . f [1]= v a a r g ( ap , INT32 ) ;<br />
thisOp−>op [ 0 ] . v a l . l = v a a r g ( ap , INT32 ) ;<br />
/∗ r e a d operand #1 ( sometimes p r e s e n t ) ∗/<br />
i f ( ( s t a t t y p e != A3 GOTO ) &&<br />
1 /∗ r e a d operand #2 ( b i n a r y op o n l y ) ∗/<br />
2 i f ( ( s t a t t y p e == A3 BINARY OP ) | |<br />
3 ( s t a t t y p e == A3 COND ) )<br />
4 {<br />
5 thisOp−>op [ 2 ] . t y p e<br />
6 = v a a r g ( ap , a 3 a r g u m e n t t y p e ) ;<br />
7<br />
8 i f ( ( thisOp−>op [ 2 ] . t y p e == oCFLOAT ) | |<br />
9 ( thisOp−>op [ 2 ] . t y p e & 1 6 ) )<br />
10 {<br />
12 thisOp−>op [ 2 ] . v a l . f [1]= v a a r g ( ap , INT32 ) ;<br />
13 }<br />
14 e l s e<br />
15 thisOp−>op [ 2 ] . v a l . l = v a a r g ( ap , INT32 ) ;<br />
16 }<br />
17 e l s e<br />
18 thisOp−>op [ 2 ] . t y p e = oNONE ;<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 13 / 63
Techniken zur Klonerkennung<br />
Klontypen: Typ 3<br />
r e t u r n FALSE ;<br />
}<br />
i f ( ! parse ( ) )<br />
{<br />
}<br />
p r i n t e r r o r ( s t d o u t , 0 ) ;<br />
r e t u r n FALSE ;<br />
fclose( fp ) ;<br />
i f ( d e b u g f l a g )<br />
{<br />
p r i n t f ( ” result of parser ” ) ;<br />
i f ( ! p r i n t t r e e ( FALSE ) )<br />
{<br />
p r i n t e r r o r ( s t d o u t , 0 ) ;<br />
r e t u r n FALSE ;<br />
}<br />
}<br />
i f ( v e r b o s e f l a g | | d e b u g f l a g )<br />
p r i n t f ( ” s e m a n t i c a n a l y s i s \n” ) ;<br />
1 i f ( v e r b o s e f l a g | | d e b u g f l a g )<br />
2 p r i n t f ( ” t y p e c h e c k i n g \n” ) ;<br />
3<br />
4 i f ( ! type check ( ) )<br />
5 {<br />
6 p r i n t e r r o r ( s t d o u t , 0 ) ;<br />
7 r e t u r n FALSE ;<br />
8 }<br />
9<br />
10 i f ( d e b u g f l a g )<br />
11 {<br />
12 p r i n t f ( ” result of type check ” ) ;<br />
13 i f ( ! p r i n t t r e e ( TRUE ) )<br />
14 {<br />
15 p r i n t e r r o r ( s t d o u t , 0 ) ;<br />
16 r e t u r n FALSE ;<br />
17 }<br />
18 }<br />
19<br />
20 i f ( g e n c o d e f l a g )<br />
21 {<br />
22 i f ( ( f p = f o p e n ( o u t f i l e n a m e , ”wt”))==NULL)<br />
23 {<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 14 / 63
Arten von Klonen Die Kopie eines Programmfragments wird Klon genannt.<br />
Typ 1 Exakte Kopie<br />
• Keinerlei Veränderung an der Kopie (bis auf White Space und 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. ” Wiederverwendung“ einer Funktion, generische Funktion von Hand<br />
Typ 3 Kopie mit weiteren Modifikationen<br />
• Code der Kopie wird abgeändert, nicht nur Bezeichner.<br />
• Z.B. ” Erweiterung“ einer Funktion.<br />
Typ 4 Semantische Klone<br />
• Verschiedene Implementierungen desselben Konzepts.
Techniken zur Klonerkennung<br />
Warum gibt es Klone?<br />
Entwicklungsstrategie<br />
Klone als Vorlage: Templating<br />
Verzögerte Anpassung<br />
. . .<br />
Wartung<br />
Bewährter Quelltext<br />
Unabhängigkeit<br />
. . .<br />
Einschränkungen<br />
Architektur<br />
Zeit<br />
Mangelnde Kenntnisse<br />
Programmiersprache<br />
. . .<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 15 / 63
Techniken zur Klonerkennung<br />
Was sind die Auswirkungen von Klonen?<br />
Erhöhter Ressourcenbedarf<br />
Erhöhter Aufwand zum Verstehen<br />
Erhöhter Aufwand zum Ändern<br />
Duplizieren von Fehlern<br />
Unvollständige Anpassung<br />
Gefahr von inkonsistenten Änderungen<br />
Erhöhter Testaufwand<br />
. . .<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 16 / 63
Techniken zur Klonerkennung<br />
Studien zu Auswirkungen von Klonen<br />
Wissenschaftliche Studien lassen negative Auswirkungen von Klonen<br />
erkennen:<br />
höchste Fehlerdichte in Modulen mit besonders langen Klonen<br />
(Monden u. a. 2002):<br />
Fehler treten vermehrt auf, wenn Klone vorkommen (Chou u. a. 2001)<br />
Fehler wegen Klonen, deren Bezeichner inkonsistent umbenannt<br />
wurden (Li u. a. 2006)<br />
Fehler durch inkonsistent geänderte Klone (Jürgens u. a. 2009)<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 18 / 63
Techniken zur Klonerkennung<br />
Nächster Abschnitt<br />
Wie können Klone gefunden werden?<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 19 / 63
Techniken zur Klonerkennung<br />
Wie können Klone gefunden werden?<br />
Granularität<br />
Klassen, Dateien<br />
Funktionen<br />
Anweisungen<br />
Vergleich von . . .<br />
Text<br />
Bezeichnern<br />
Token<br />
Syntaxbäume<br />
Kontroll- und Datenabhängigkeiten<br />
Verwendete Techniken:<br />
textual diff<br />
dotplot<br />
data mining<br />
suffix tree<br />
tree matching<br />
graph matching<br />
latent semantic<br />
indexing<br />
metric vector<br />
comparison<br />
hashing<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 20 / 63
Techniken 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 von Typ 1 und Typ 2 können<br />
zu größeren Klonen zusammengefasst werden.<br />
Codefragmente müssen nicht direkt zusammenhängend sein.<br />
Code muss nicht identisch, nur ähnlich sein: Ähnlichkeitsmaß?<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 21 / 63
Techniken zur Klonerkennung<br />
Textuelle Verfahren<br />
Vergleich von. . .<br />
Bezeichner und Kommentare (Information-Retrieval-Techniken)<br />
Latent Semantic Indexing (Marcus und Maletic 2001)<br />
text<br />
Zeichenkettenvergleich (Johnson 1993, 1994) mittels Hashwerten<br />
zeilenweiser Vergleich über Dot-Plots (Ducasse u. a. 1999; Rieger<br />
2005)<br />
42<br />
27<br />
124 67 12<br />
42<br />
95 ...<br />
a a b x y a a b z ...<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 22 / 63<br />
...
Dot-Plot:<br />
file1.c<br />
file2.c<br />
file1.c<br />
file2.c<br />
1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8
Techniken zur Klonerkennung<br />
Wie können Klone gefunden werden?<br />
Vergleich von . . .<br />
Tokens<br />
Type-1/-2-Klone: Suffixbaum für parameterisierte Zeichenketten pro<br />
Zeile (Baker 1995)<br />
x y a a b $<br />
a b<br />
$<br />
a<br />
x y a a b $<br />
b<br />
a a b x y a a b $<br />
$<br />
b<br />
x y a a b $<br />
$<br />
x y a a b $<br />
y a a b $<br />
$<br />
Type-3: Zusammenfassung von Typ-1/2-Klonen mit Lücken (Baker<br />
Rainer Koschke 1995). (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 23 / 63
Techniken zur Klonerkennung<br />
Wie können Klone gefunden werden?<br />
Vergleich von . . .<br />
Metriken (Mayrand u. a. 1996; Kontogiannis 1997)<br />
Anweisungen durch Data-Mining-Techniken (Wahler u. a. 2004; Li<br />
u. a. 2004)<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 24 / 63
Techniken zur Klonerkennung<br />
Wie können Klone gefunden werden?<br />
Vergleich von . . .<br />
Syntaxbäumen<br />
Hashing mit Baum-Matching (Baxter u. a. 1998)<br />
Baum-Matching mit dynamischem Programmieren (für Dateivergleich)<br />
(Yang 1991)<br />
Suffixbaum für serialisierten Syntaxbaum (Koschke u. a. 2006)<br />
+<br />
id id<br />
if<br />
=<br />
id id<br />
=<br />
id call<br />
id<br />
seq<br />
if<br />
id =<br />
id id<br />
=<br />
id literal<br />
if<br />
id =<br />
id id<br />
=<br />
id id<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 25 / 63
Techniken zur Klonerkennung<br />
Wie können Klone gefunden werden?<br />
Vergleich von Program-Dependency-Graphs (PDG) (Komondoor und<br />
Horwitz 2001; Krinke 2001)<br />
r e a d ( n ) ; r e a d (m) ;<br />
i = 1 ; s = 0 ;<br />
p r o d u c t = 1 ; p = 1 ;<br />
sum = 0 ; f o r ( j = 1 ; j
Techniken zur Klonerkennung<br />
Verfahren nach Baker (1995)<br />
Verfahren vergleicht Token-Sequenzen<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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 27 / 63
Techniken 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 (genauer: Token-Sequenz) wird auf eindeutiges<br />
Nichtparametersymbol 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 28 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 29 / 63
Techniken zur Klonerkennung<br />
P-Suffix-Baum<br />
Sei Si = sisi+1 . . . sn$ das i’te Suffix von S ($ ist das Endezeichen).<br />
Der P-Suffix-Baum von S enthält alle prev(Si) zu den Suffixen des<br />
P-Strings S.<br />
Beispiel: S = αyβyαxαx<br />
prev(S1) = α0β2α0α2$<br />
prev(S2) = 0β2α0α2$<br />
prev(S3) = β0α0α2$<br />
$<br />
prev(S4) = 0α0α2$<br />
prev(S5) = α0α2$<br />
prev(S6) = 0α2$<br />
prev(S7) = α0$<br />
prev(S8) = 0$<br />
prev(S9) = $<br />
$<br />
α2$<br />
α0<br />
β0α0α2$<br />
β2α0α2$<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 30 / 63
Techniken zur Klonerkennung<br />
P-Suffix-Baum<br />
Klone: Verzweigungen im Suffix-Baum<br />
Länge: Anzahl der Funktoren<br />
→ Benutzer kann Mindestlänge festlegen<br />
Ort: Anzahl Funktoren zum Blatt gibt die Position relativ zum<br />
Programmende wieder<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 31 / 63
Techniken zur Klonerkennung<br />
Typ-3-Erkennung<br />
Gefundene P-Matches werden, wenn möglich, zusammengefasst:<br />
d<br />
1<br />
A<br />
B<br />
Modi:<br />
nur wenn d1 = d2<br />
wenn max(d1, d2) ≤ Θ<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 32 / 63<br />
A<br />
B<br />
d 2
Techniken zur Klonerkennung<br />
Bewertung des Ansatzes von Baker<br />
Bakers Klonerkennung ist lexem-basiert und damit sehr schnell:<br />
lineare Zeit- und Speicherkomplexität<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 />
Erweiterung von Kamiya u. a. (2002): Normalisierung des<br />
Tokenstroms (z.B. Entfernen von Qualifier wie static)<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 33 / 63
Techniken zur Klonerkennung<br />
Bewertung des Ansatzes von Baker<br />
Allerdings entgehen dem Ansatz:<br />
äquivalente Ausdrücke mit kommutativen Operatoren:<br />
x = x + y x = y + x<br />
gleiche Anweisungsfolgen, die verschieden umbrochen wurden:<br />
gleiche Teilausdrücke:<br />
if (a > 1) {x = 1;} if (a > 1)<br />
{x = 1;}<br />
if (sp > 0) if (sp > 0 && s[sp] != a)<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 34 / 63
Techniken zur Klonerkennung<br />
AST-Matching<br />
Ansatz basierend auf abstrakten Syntaxbäumen (ASTs):<br />
vergleiche jeden Teilbaum mit jedem anderen Teilbaum auf Gleichheit<br />
if if<br />
cond else cond else<br />
then then<br />
= call :=<br />
=<br />
left right<br />
lhs rhs<br />
left right<br />
call<br />
:=<br />
lhs rhs<br />
a b x y z q t s<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 35 / 63
Techniken zur Klonerkennung<br />
Verfahren nach Baxter u. a. (1998)<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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 36 / 63
Techniken zur Klonerkennung<br />
Skalierungsproblem und Erkennung der Klontypen<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 × arg1 × arg2 × . . . × argn → integer<br />
Typ-1-Klonerkennung: h liefert genaue Partitionierung<br />
Typ-2/3-Klonerkennung: h ignoriert Bezeichner<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 37 / 63
Techniken zur Klonerkennung<br />
Skalierungsproblem und Erkennung der Klontypen<br />
Bäume werden auf Ähnlichkeit verglichen (nicht auf Gleichheit):<br />
Similarity(T1, T2) =<br />
2 · Same(T1, T2)<br />
2 · Same(T1, T2) + Difference(T1, T2)<br />
Similarity muss über benutzerdefiniertem Schwellwert ΘS liegen:<br />
Similarity(T1, T2) ≥ Θ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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 38 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 39 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 40 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 41 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 42 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 43 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 44 / 63
Techniken 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 45 / 63
Techniken zur Klonerkennung<br />
Verfahren nach Mayrand u. a. (1996)<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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 46 / 63
Techniken zur Klonerkennung<br />
Vergleich auf Basis von Kennzahlen<br />
Hoffnung:<br />
Code1 = Code2 ⇔ Kennzahlen(Code1) = Kennzahlen(Code2)<br />
Granularität üblicherweise Funktionsebene, da hierfür viele Metriken<br />
existieren<br />
Aspekte nach Mayrand u. a. (1996):<br />
Namen<br />
Layout<br />
Anweisungen<br />
Kontrollfluss<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 47 / 63
Techniken zur Klonerkennung<br />
Vergleichsmetriken (Mayrand u. a. 1996)<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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 48 / 63
Techniken zur Klonerkennung<br />
Vergleichsmetriken (Mayrand u. a. 1996)<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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 49 / 63
Techniken zur Klonerkennung<br />
Zusammenfassung der Metriken<br />
Zwei Funktionen f1 und f2 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 />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 50 / 63
Techniken zur Klonerkennung<br />
Klassifikation<br />
Exakte Kopie: Funktionen sind in jedem Aspekt gleich (Typ-1-Klon)<br />
Ähnliches Layout:<br />
Ähnliches Layout und ähnliche Namen, gleiche<br />
Anweisungen und Kontrollfluss (≈ Typ-2-Klon)<br />
Ähnliche Ausdrücke: Name und Layout sind verschieden, Anweisungen<br />
und Kontrollfluss sind gleich (≈ Typ-2-Klon)<br />
Verschieden: Alle Aspekte sind verschieden.<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 51 / 63
Techniken zur Klonerkennung<br />
Bewertung des Ansatzes von Mayrand u. a. (1996)<br />
Aspekte sind nicht unabhängig.<br />
Definition der Bandbreite ist notwendig.<br />
(Klassifikation ist unvollständig.)<br />
Präzision:<br />
Code1 = Code2 ⇒ Kennzahlen(Code1) = Kennzahlen(Code2) √<br />
Code1 ≈ Code2 ⇒ Kennzahlen(Code1) ≈ Kennzahlen(Code2) √<br />
Kennzahlen(Code1) = Kennzahlen(Code2) ⇒ Code1 = Code2 ?<br />
Kennzahlen(Code1) ≈ Kennzahlen(Code2) ⇒ Code1 ≈ Code2 ???<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 52 / 63
Techniken zur Klonerkennung<br />
Vergleich von Klonerkennungstechniken (Bellon 2003;<br />
Bellon u. a. 2007)<br />
Teilnehmer Ansatz<br />
Matthias Rieger Pattern Matching auf Dotplots (textuell)<br />
Brenda S. Baker Suffix-Tree, tokenbasiert (zeilenweise)<br />
Toshihiro Kamiya Suffix-Tree, tokenbasiert (Einzeltoken)<br />
+ Eingabetransformation<br />
Ira D. Baxter Subtree-Matching im AST<br />
Ettore Merlo Funktions-Metriken + Token-Vergleich<br />
Jens Krinke Program Dependency Graph<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 53 / 63
Techniken zur Klonerkennung<br />
Zusammenfassung<br />
Rieger Baker Kamiya Baxter Krinke Merlo<br />
Ansatz Text Token Token AST PDG Metrik<br />
Erkennt Typ 1–3 1, 2 1–3 1, 2 3 1–3<br />
Klassifiziert – 1, 2 – 1, 2 3 1–3<br />
Geschwind. ? + + + - - - + +<br />
Speicher ? + + - + + +<br />
Recall + + + - - -<br />
Precision - - - + - +<br />
Versteckte 31 % 42 % 46 % 28 % 4 % 24 %<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 54 / 63
Techniken zur Klonerkennung<br />
Weiterführende Literatur<br />
McCreight (1976): Konstruktion von Suffix-Bäumen für<br />
Zeichenketten in linearer Zeit und mit linearem Speicheraufwand<br />
(relativ zur Länge der Zeichenkette)<br />
Ukkonen (1995): wie McCreight, jedoch wird Eingabe von links nach<br />
rechts verarbeitet (on-line).<br />
Baker (1997) wie McCreight, jedoch für parametrisierte Zeichenketten<br />
Kodierung kann sich bei Entfernung des ersten Elements ändern<br />
→ Distinct Right Context Property ist verletzt<br />
www.csse.monash.edu.au/~lloyd/tildeAlgDS/Tree/Suffix/<br />
und<br />
http://www.dogma.net/markn/articles/suffixt/suffixt.htm:<br />
Erklärungen, Beispiele, Referenzen und Algorithmen<br />
Koschke u. a. (2006) verwenden Suffixbäume für AST-basierte<br />
Erkennung<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 55 / 63
• McCreight (1976) stellt einen Algorithmus zur Konstruktion von Suffix-Bäumen für Zeichenketten vor (als Verbesserun<br />
von Weimers Algorithmus), der lineare Zeit und linearen Speicheraufwand (relativ zur Länge der Zeichenkette) benötig<br />
• Ukkonen (1995) beschreibt einen Algorithmus zur Konstruktion von Suffix-Bäumen für Zeichenketten, der die gleiche<br />
Zeit- und Speicherkomplexität wie der von McCreight aufweist, dafür aber algorithmisch einfacher ist und die Eingabe<br />
von links nach rechts verarbeitet (deshalb als on-line bezeichnet wird).<br />
• Baker (1997) erweitert den Algorithmus von McCreight für parametrisierte Zeichenketten (deren Kodierung sich bei<br />
Entfernung des ersten Elements nämlich ändern kann, was eine Verletzung der Distinct Right Context Property darstel<br />
die für das korrekte Funktionieren von McCreights Algorithmus Voraussetzung ist).<br />
• http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Tree/Suffix/ und<br />
http://www.dogma.net/markn/articles/suffixt/suffixt.htm geben Erklärungen, Beispiele, Referenzen und<br />
Algorithmen an.
Techniken zur Klonerkennung<br />
Wiederholungs- und Vertiefungsfragen I<br />
Was versteht man unter Klonen? Welche Typen gibt es? Mit Beispiel.<br />
Wie entstehen Klone?<br />
Warum sind Klone problematisch?<br />
Welche Klassen von Ansätzen zur Erkennung von Klonen gibt es und<br />
wie sind diese charakterisiert?<br />
Welche Probleme müssen bei der Erkennung bewältigt werden?<br />
Wie funktioniert der Ansatz von Baker?<br />
Wie ist der Ansatz von Baker zu bewerten?<br />
Wie funktioniert der Ansatz von Baxter?<br />
Wie ist der Ansatz von Baxter zu bewerten?<br />
Wie funktioniert der Ansatz von Mayrand?<br />
Wie ist der Ansatz von Mayrand zu bewerten?<br />
Welche Grundannahme liegt dem Ansatz von Mayrand zu Grunde?<br />
Diskutiere die Annahme.<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 56 / 63
Techniken zur Klonerkennung<br />
Baker 1997 Baker, Brenda: Parameterized duplication in strings:<br />
Algorithms and an application to software maintenance. 26 (1997),<br />
Oktober, Nr. 5, S. 1343–1362<br />
Baker 1995 Baker, Brenda S.: On Finding Duplication and<br />
Near-Duplication in Large <strong>Software</strong> Systems. In: Wills, L. (Hrsg.) ;<br />
Newcomb, P. (Hrsg.) ; Chikofsky, E. (Hrsg.): Working Conference<br />
on Reverse Engineering. Los Alamitos, California : IEEE Computer<br />
Society Press, Juli 1995, S. 86–95. – URL<br />
http://citeseer.nj.nec.com/baker95finding.html<br />
Baxter u. a. 1998 Baxter, Ira D. ; Yahin, Andrew ; Moura,<br />
Leonardo ; Sant’Anna, Marcelo ; Bier, Lorraine: Clone Detection<br />
Using Abstract Syntax Trees. In: Koshgoftaar, T. M. (Hrsg.) ;<br />
Bennett, K. (Hrsg.): International Conference on <strong>Software</strong><br />
Maintenance, IEEE Computer Society Press, 1998, S. 368–378. – ISBN<br />
0-7803-5255-6, 0-8186-8779-7, 0-8186-8795-9<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 57 / 63
Techniken zur Klonerkennung<br />
Bellon 2003 Bellon, Stefan: Vergleich von Klonerkennungstechniken.<br />
Fakultät <strong>Informatik</strong>, <strong>Universität</strong> Stuttgart, Deutschland, Diplomarbeit,<br />
2003<br />
Bellon u. a. 2007 Bellon, Stefan ; Koschke, Rainer ; Antoniol,<br />
Giulio ; Krinke, Jens ; Merlo, Ettore: Comparison and Evaluation of<br />
Clone Detection Tools. In: IEEE Computer Society Transactions on<br />
<strong>Software</strong> Engineering 33 (2007), September, Nr. 9, S. 577–591<br />
Chou u. a. 2001 Chou, Andy ; Yang, Junfeng ; Chelf, Benjamin ;<br />
Hallem, Seth ; Engler, Dawson R.: An Empirical Study of<br />
Operating System Errors. In: Symposium on Operating Systems<br />
Principles, ACM Press, 2001, S. 73–88. – URL<br />
citeseer.ist.psu.edu/chou01empirical.html<br />
Cordy u. a. 2004 Cordy, James R. ; Dean, Thomas R. ;<br />
Synytskyy, Nikita: Practical language-independent detection of<br />
near-miss clones. In: Conference of the Centre for Advanced Studies on<br />
Collaborative research, IBM Press, 2004, S. 1–12<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 58 / 63
Techniken zur Klonerkennung<br />
Ducasse u. a. 1999 Ducasse, Stéphane ; Rieger, Matthias ;<br />
Demeyer, Serge: A Language Independent Approach for Detecting<br />
Duplicated Code. In: Proceedings of the International Conference on<br />
<strong>Software</strong> Maintenance (ICSM99), 1999, S. 109–118<br />
Higo u. a. 2002 Higo, Yoshiki ; Ueda, Yasushi ; Kamiya, Toshihro ;<br />
Kusumoto, Shinji ; Inoue, Katsuro: On <strong>Software</strong> Maintenance<br />
Process Improvement Based on Code Clone Analysis. In: International<br />
Conference on Product Focused <strong>Software</strong> Process Improvement<br />
Bd. 2559, Springer, 2002, S. 185–197. – ISBN ISBN:3-540-00234-0<br />
Johnson 1993 Johnson, J. H.: Identifying redundancy in source code<br />
using fingerprints. In: Conference of the Centre for Advanced Studies on<br />
Collaborative research, IBM Press, 1993, S. 171–183<br />
Johnson 1994 Johnson, J. H.: Substring matching for clone detection<br />
and change tracking. In: International Conference on <strong>Software</strong><br />
Maintenance, IEEE Computer Society Press, 1994, S. 120–126<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 59 / 63
Techniken zur Klonerkennung<br />
Jürgens u. a. 2009 Jürgens, E. ; Deissenböck, F. ; Hummel, B. ;<br />
Wagner, S.: Do Code Clones Matter? In: International Conference on<br />
<strong>Software</strong> Engineering, ACM Press, 2009<br />
Kamiya u. a. 2002 Kamiya, Toshihiro ; Kusumoto, Shinji ; Inoue,<br />
Katsuro: CCFinder: A Multi-Linguistic Token-based Code Clone<br />
Detection System for Large Scale Source Code. In: IEEE Computer<br />
Society Transactions on <strong>Software</strong> Engineering 28 (2002), Nr. 7,<br />
S. 654–670<br />
Komondoor und Horwitz 2001 Komondoor, R. ; Horwitz, S.:<br />
Using slicing to identify duplication in source code. In: Proc. Int.<br />
Symposium on Static Analysis, Juli 2001, S. 40–56<br />
Kontogiannis 1997 Kontogiannis, K.: Evaluation Experiments on<br />
the Detection of Programming Patterns Using <strong>Software</strong> Metrics. In:<br />
Working Conference on Reverse Engineering, 1997, S. 44–53<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 60 / 63
Techniken zur Klonerkennung<br />
Koschke u. a. 2006 Koschke, Rainer ; Falke, Raimar ; Frenzel,<br />
Pierre: Clone Detection Using Abstract Syntax Suffix Trees. In: Working<br />
Conference on Reverse Engineering, IEEE Computer Society Press,<br />
2006, S. 253–262<br />
Krinke 2001 Krinke, Jens: Identifying Similar Code with Program<br />
Dependence Graphs. In: Working Conference on Reverse Engineering,<br />
2001, S. 301–309<br />
Li u. a. 2004 Li, Z. ; Lu, S. ; Myagmar, S. ; Zhou, Y.: CP-Miner: A<br />
tool for Finding copy-paste and related bugs in operating system code.<br />
In: Operating System Design and Implementation, 2004, S. 289–302<br />
Li u. a. 2006 Li, Z ; Lu, S ; Myagmar, S. ; Zhou, Y.: Copy-Paste<br />
and Related Bugs in Large-Scale <strong>Software</strong> Code. In: IEEE Computer<br />
Society Transactions on <strong>Software</strong> Engineering 32 (2006), März, Nr. 3,<br />
S. 176–192<br />
Marcus und Maletic 2001 Marcus, A. ; Maletic, J.I.: Identification<br />
of high-level concept clones in source code. In: International Conference<br />
on Automated <strong>Software</strong> Engineering, 2001, S. 107–114<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 61 / 63
Techniken zur Klonerkennung<br />
Mayrand u. a. 1996 Mayrand, Jean ; Leblanc, Claude ; Merlo,<br />
Ettore M.: Experiment on the Automatic Detection of Function Clones<br />
in a <strong>Software</strong> System using Metrics. In: Proceedings of the International<br />
Conference on <strong>Software</strong> Maintenance. Washington : IEEE Computer<br />
Society Press, November 4–8 1996, S. 244–254. – ISBN 0-8186-7678-7<br />
McCreight 1976 McCreight, E. M.: A space-economical suffix-tree<br />
construction algorithm. In: Journal of the ACM 23 (1976), Nr. 2,<br />
S. 262–272<br />
Monden u. a. 2002 Monden, A. ; Nakae, D. ; Kamiya, T. ; Sato,<br />
S. ; Matsumoto, K.: <strong>Software</strong> quality analysis by code clones in<br />
industrial legacy software. In: IEEE Symposium on <strong>Software</strong> Metrics,<br />
2002, S. 87–94<br />
Rieger 2005 Rieger, Matthias: Effective Clone Detection Without<br />
Language Barriers, University of Bern, Switzerland, Dissertation, 2005<br />
Synytskyy u. a. 2003 Synytskyy, Nikita ; Cordy, James R. ;<br />
Dean, Thomas: Resolution of static clones in dynamic Web pages. In:<br />
Proceedings of the Workshop on Website Evolution, 2003, S. 49–56<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 62 / 63
Techniken zur Klonerkennung<br />
Ukkonen 1995 Ukkonen, E.: On-line construction of suffix trees. In:<br />
Algorithmica 14 (1995), S. 249–260<br />
Wahler u. a. 2004 Wahler, V. ; Seipel, D. ; Gudenberg,<br />
Jürgen W. von ; Fischer, G.: Clone detection in source code by<br />
frequent itemset techniques. In: Proceedings of the Fourth IEEE<br />
International Workshop on Source Code Analysis and Manipulation,<br />
2004, S. 128–135<br />
Yang 1991 Yang, Wuu: Identifying Syntactic Differences Between<br />
Two Programs. In: <strong>Software</strong>–Practice and Experience 21 (1991), Juli,<br />
Nr. 7, S. 739–755<br />
Rainer Koschke (Univ. <strong>Bremen</strong>) <strong>Vorlesung</strong> <strong>Software</strong>-<strong>Reengineering</strong> WS 2009/2010 63 / 63