30.11.2012 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

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!