View
442
Download
0
Category
Tags:
Preview:
DESCRIPTION
"Unsupervised Machine Learning for clone detection" highlights the main topics of using Unsupervised Machine Learning techniques (Kernel methods and data clustering) for the code clones detection task.
Citation preview
UNSUPERVISED MACHINE LEARNING FOR CLONE DETECTIONValerio Maggio, Ph.D.
June 25, 2013valerio.maggio@unina.it
General Disclaimer: All the Maths appearing in the next slides is only intended to better introduce the considered case studies. Speakers are not
responsible for any possible disease or “brain consumption” caused by too much formulas.
So BEWARE; use this information at your own risk!
It's intention is solely educational. We would strongly encourage you to use this information in cooperation with a medical or
health professional.
Aw
ful M
aths
Number one in the stink parade is duplicated code.
If you see the same code structure in more than one
place, you can be sure that your program will be better
if you find a way to unify them.
ImageMapOutputFormat.java SVGOutputFormat.java
JHOTDRAW
CPY
THO
N 2.
5.1
PYTHON (NLTK)
PROBLEM
S T A T EM E N T
CLONE DETECTIONSoftware clones are fragments of code that are similar according
to some predefined measure of similarity
I.D. Baxter, 1998
PROBLEM
S T A T EM E N T
CLONE DETECTION
PROBLEM
S T A T EM E N T
CLONE DETECTION
Clones Textual Similarity
PROBLEM
S T A T EM E N T
CLONE DETECTION
Clones Functional Similarity
PROBLEM
S T A T EM E N T
CLONE DETECTION
Clones affect the reliability of the system!
Sneaky Bug!
DIFFERENT TYPES OF CLONES
THE ORIGINAL ONE
# Original Fragmentdef do_something_cool_in_Python(filepath, marker='---end---'):! lines = list()! with open(filepath) as report:! ! for l in report:! ! ! if l.endswith(marker):! ! ! ! lines.append(l) # Stores only lines that ends with "marker"! return lines #Return the list of different lines
TYPE 1: Exact Copy• Identical code segments except for differences in
layout, whitespace, and comments
def do_something_cool_in_Python (filepath, marker='---end---'):! lines = list() # This list is initially empty
! with open(filepath) as report:! ! for l in report: # It goes through the lines of the file! ! ! if l.endswith(marker):! ! ! ! lines.append(l)! return lines
TYPE 1: Exact Copy• Identical code segments except for differences in
layout, whitespace, and comments
# Original Fragmentdef do_something_cool_in_Python(filepath, marker='---end---'):! lines = list()! with open(filepath) as report:! ! for l in report:! ! ! if l.endswith(marker):! ! ! ! lines.append(l) # Stores only lines that ends with "marker"! return lines #Return the list of different lines
TYPE 2: Parameter Substituted• Structurally identical segments except for differences in identifiers, literals,
layout, whitespace, and comments
# Type 2 Clonedef do_something_cool_in_Python(path, end='---end---'):! targets = list()! with open(path) as data_file:! ! for t in datae:! ! ! if l.endswith(end):! ! ! ! targets.append(t) # Stores only lines that ends with "marker"! #Return the list of different lines! return targets
# Original Fragmentdef do_something_cool_in_Python(filepath, marker='---end---'):! lines = list()! with open(filepath) as report:! ! for l in report:! ! ! if l.endswith(marker):! ! ! ! lines.append(l) # Stores only lines that ends with "marker"! return lines #Return the list of different lines
TYPE 2: Parameter Substituted• Structurally identical segments except for differences in identifiers, literals,
layout, whitespace, and comments
TYPE 3: Structure Substituted• Similar segments with further modifications such as changed, added (or deleted)
statements, in additions to variations in identifiers, literals, layout and comments
import osdef do_something_with(path, marker='---end---'):! # Check if the input path corresponds to a file! if not os.path.isfile(path):! ! return None! bad_ones = list()! good_ones = list()! with open(path) as report:! ! for line in report:! ! ! line = line.strip()! ! ! if line.endswith(marker):! ! ! ! good_ones.append(line)! ! ! else:! ! ! ! bad_ones.append(line)! #Return the lists of different lines! return good_ones, bad_ones
TYPE 3: Structure Substituted• Similar segments with further modifications such as changed, added (or deleted)
statements, in additions to variations in identifiers, literals, layout and comments
import osdef do_something_with(path, marker='---end---'):! # Check if the input path corresponds to a file! if not os.path.isfile(path):! ! return None! bad_ones = list()! good_ones = list()! with open(path) as report:! ! for line in report:! ! ! line = line.strip()! ! ! if line.endswith(marker):! ! ! ! good_ones.append(line)! ! ! else:! ! ! ! bad_ones.append(line)! #Return the lists of different lines! return good_ones, bad_ones
TYPE 3: Structure Substituted• Similar segments with further modifications such as changed, added (or deleted)
statements, in additions to variations in identifiers, literals, layout and comments
import osdef do_something_with(path, marker='---end---'):! # Check if the input path corresponds to a file! if not os.path.isfile(path):! ! return None! bad_ones = list()! good_ones = list()! with open(path) as report:! ! for line in report:! ! ! line = line.strip()! ! ! if line.endswith(marker):! ! ! ! good_ones.append(line)! ! ! else:! ! ! ! bad_ones.append(line)! #Return the lists of different lines! return good_ones, bad_ones
TYPE 3: Structure Substituted• Similar segments with further modifications such as changed, added (or deleted)
statements, in additions to variations in identifiers, literals, layout and comments
import osdef do_something_with(path, marker='---end---'):! # Check if the input path corresponds to a file! if not os.path.isfile(path):! ! return None! bad_ones = list()! good_ones = list()! with open(path) as report:! ! for line in report:! ! ! line = line.strip()! ! ! if line.endswith(marker):! ! ! ! good_ones.append(line)! ! ! else:! ! ! ! bad_ones.append(line)! #Return the lists of different lines! return good_ones, bad_ones
TYPE 3: Structure Substituted• Similar segments with further modifications such as changed, added (or deleted)
statements, in additions to variations in identifiers, literals, layout and comments
TYPE 4: “Functional” Copies• Semantically equivalent segments that perform the same
computation but are implemented by different syntactic variants
# Original Fragmentdef do_something_cool_in_Python(filepath, marker='---end---'):! lines = list()! with open(filepath) as report:! ! for l in report:! ! ! if l.endswith(marker):! ! ! ! lines.append(l) # Stores only lines that ends with "marker"! return lines #Return the list of different lines
def do_always_the_same_stuff(filepath, marker='---end---'):! report = open(filepath)! file_lines = report.readlines()! report.close()! #Filters only the lines ending with marker! return filter(lambda l: len(l) and l.endswith(marker), file_lines)
TYPE 4: “Functional” Copies• Semantically equivalent segments that perform the same
computation but are implemented by different syntactic variants
HTTP
D 2.
2.14
: TYP
E 1
HTTP
D 2.
2.14
: TYP
E 2
HTTP
D 2.
2.14
: TYP
E 3
SOUR
CE
CO
DE IN
FOR
MAT
ION
SOUR
CE
CO
DE IN
FOR
MAT
ION
SOUR
CE
CO
DE IN
FOR
MAT
ION FUNCTION
parser_compare PARAMS
PARAMPARAM
node *left node *right
IF-STMT IF-STMT RETURN-STMT
BODY
CALL-STMT
parser_compare_node
PARAMS
STRUCT-OP
right st_nodeleft st_node
BODY BODYCOND COND
OR
====
left right0 0
==
rightleft
RETURN-STMTRETURN-STMT
00
SOUR
CE
CO
DE IN
FOR
MAT
ION
ENTRY EXIT
FORMAL-IN
ACTUAL-IN
ACTUAL-IN
FORMAL-IN
BODY
CONTROL-POINTEXPR
CONTROL-POINT CONTROL-POINT CALL-SITE
RETURN
ACTUAL-OUT
RETURN
EXPR
EXPR
FORMAL-OUT
Duplix
Scorpio
PMD
CCFinder
Dup CPD
Duplix
Shinobi
Clone Detective
Gemini
iClones
KClone
ConQAT
Deckard
Clone Digger
JCCD
CloneDr SimScan
CLICS
NiCAD
Simian
Duploc
Dude
SDD
STAT
E O
F TH
E A
RT
TOO
LS
Duplix
Scorpio
PMD
CCFinder
Dup CPD
Duplix
Shinobi
Clone Detective
Gemini
iClones
KClone
ConQAT
Deckard
Clone Digger
JCCD
CloneDr SimScan
CLICS
NiCAD
Simian
Duploc
Dude
SDD
Text Based Tools:
Text is compared line by line
STAT
E O
F TH
E A
RT
TOO
LS
Duplix
Scorpio
PMD
CCFinder
Dup CPD
Duplix
Shinobi
Clone Detective
Gemini
iClones
KClone
ConQAT
Deckard
Clone Digger
JCCD
CloneDr SimScan
CLICS
NiCAD
Simian
Duploc
Dude
SDD
Token Based Tools:Token sequences are
compared to sequences
STAT
E O
F TH
E A
RT
TOO
LS
Duplix
Scorpio
PMD
CCFinder
Dup CPD
Duplix
Shinobi
Clone Detective
Gemini
iClones
KClone
ConQAT
Deckard
Clone Digger
JCCD
CloneDr SimScan
CLICS
NiCAD
Simian
Duploc
Dude
SDDSyntax Based Tools:
Syntax subtrees are compared
to each other
STAT
E O
F TH
E A
RT
TOO
LS
Duplix
Scorpio
PMD
CCFinder
Dup CPD
Duplix
Shinobi
Clone Detective
Gemini
iClones
KClone
ConQAT
Deckard
Clone Digger
JCCD
CloneDr SimScan
CLICS
NiCAD
Simian
Duploc
Dude
SDD
Graph Based Tools:
(sub) graphs are compared to
each other
STAT
E O
F TH
E A
RT
TOO
LS
• String/Token based Techniques:
• Pros: Run very fast
• Cons: Too many false clones
STAT
E O
F TH
E A
RT
TEC
HNIQ
UES
• String/Token based Techniques:
• Pros: Run very fast
• Cons: Too many false clones
• Syntax based (AST) Techniques:
• Pros: Well suited to detect structural similarities
• Cons: Not Properly suited to detect Type 3 Clones
STAT
E O
F TH
E A
RT
TEC
HNIQ
UES
• String/Token based Techniques:
• Pros: Run very fast
• Cons: Too many false clones
• Syntax based (AST) Techniques:
• Pros: Well suited to detect structural similarities
• Cons: Not Properly suited to detect Type 3 Clones
• Graph based Techniques:
• Pros: The only one able to deal with Type 4 Clones
• Cons: Performance Issues
STAT
E O
F TH
E A
RT
TEC
HNIQ
UES
USE MACHINE LEARNING
L U K E
USE MACHINE LEARNING
L U K E
• Provides computational effective solutions to analyze large data sets
USE MACHINE LEARNING
L U K E
• Provides computational effective solutions to analyze large data sets
• Provides solutions that can be tailored to different tasks/domains
USE MACHINE LEARNING
L U K E
• Provides computational effective solutions to analyze large data sets
• Provides solutions that can be tailored to different tasks/domains
• Requires many efforts in:
USE MACHINE LEARNING
L U K E
• Provides computational effective solutions to analyze large data sets
• Provides solutions that can be tailored to different tasks/domains
• Requires many efforts in:
• the definition of the relevant information best suited for the specific task/domain
USE MACHINE LEARNING
L U K E
• Provides computational effective solutions to analyze large data sets
• Provides solutions that can be tailored to different tasks/domains
• Requires many efforts in:
• the definition of the relevant information best suited for the specific task/domain
• the application of the learning algorithms to the considered data
UN
SUPE
RVIS
ED L
EARN
ING
• Supervised Learning: • Learn from labelled samples
• Unsupervised Learning:• Learn (directly) from the data
Learn by examples
UN
SUPE
RVIS
ED L
EARN
ING
• Supervised Learning: • Learn from labelled samples
• Unsupervised Learning:• Learn (directly) from the data
Learn by examples
(+) No cost of labeling samples
(-) Trade-off imposed on the quality of the data
CODESTRUCTURES
KER
NEL
S FO
R ST
RUC
TURE
SComputation of the dot product between (Graph) Structures
K( ),
CODESTRUCTURES
KER
NEL
S FO
R ST
RUC
TURE
S
Abstract Syntax Tree (AST) Tree structure representing the syntactic structure of the different instructions of a program (function)
Program Dependencies Graph (PDG)
(Directed) Graph structure representing the relationship among the different statement of a program
Computation of the dot product between (Graph) Structures
K( ),
CODEKE
RNEL
FO
R C
LONE
S
<
x y = =
x +
x 1
y -
y 1
while
block
while
block
block
if
>
b a = =
a +
a 1
b -
b 1
>
b 0 =
c 3
CODE ASTKE
RNEL
FO
R C
LONE
S
<
x y = =
x +
x 1
y -
y 1
while
block
while
block
block
if
>
b a = =
a +
a 1
b -
b 1
>
b 0 =
c 3
CODE AST AST KERNELKE
RNEL
FO
R C
LONE
S
<
block
while
= =
block
=
y -
=
x +
+
x 1
-
y 1
<
x y
>
b 0 =
c 3
if
block
>
b a
-
b 1
<block
while
+
a 1
=
b -
=
a +
while
block<
x y
KERNELSFOR CODE
STRUCTURES:AST
KERN
EL F
EATU
RES
while
block<
x y
KERNELSFOR CODE
STRUCTURES:AST
KERN
EL F
EATU
RES Instruction Class (IC)
i.e., LOOP, CALL,CONDITIONAL_STATEMENT
while
block<
x y
KERNELSFOR CODE
STRUCTURES:AST
KERN
EL F
EATU
RES Instruction Class (IC)
i.e., LOOP, CALL,CONDITIONAL_STATEMENT
Instruction (I)i.e., FOR, IF, WHILE, RETURN
while
block<
x y
KERNELSFOR CODE
STRUCTURES:AST
KERN
EL F
EATU
RES Instruction Class (IC)
i.e., LOOP, CALL,CONDITIONAL_STATEMENT
Instruction (I)i.e., FOR, IF, WHILE, RETURN
Context (C)i.e., Instruction Class of the closer statement node
while
block<
x y
KERNELSFOR CODE
STRUCTURES:AST
KERN
EL F
EATU
RES Instruction Class (IC)
i.e., LOOP, CALL,CONDITIONAL_STATEMENT
Instruction (I)i.e., FOR, IF, WHILE, RETURN
Context (C)i.e., Instruction Class of the closer statement node
Lexemes (Ls)Lexical information gathered (recursively) from leaves
while
block<
x y
KERNELSFOR CODE
STRUCTURES:AST
KERN
EL F
EATU
RES
IC = Conditional-ExprI = Less-operatorC = LoopLs= [x,y]
IC = LoopI = while-loopC = Function-BodyLs= [x, y]
Instruction Class (IC)i.e., LOOP, CALL,CONDITIONAL_STATEMENT
Instruction (I)i.e., FOR, IF, WHILE, RETURN
Context (C)i.e., Instruction Class of the closer statement node
Lexemes (Ls)Lexical information gathered (recursively) from leaves
IC = BlockI = while-bodyC = LoopLs= [ x ]
CLONE DETECTION• Comparison with another (pure) AST-based clone detector
• Comparison on a system with randomly seeded clones
0
0.25
0.5
0.75
1
Precision Recall F-measure
CloneDigger Tree Kernel Tool
RESULTS
Results refer to clones where code
fragments have been modified by adding/
removing or changing code statements
0
0.25
0.50
0.75
1.00
0.6 0.62 0.64 0.66 0.68 0.7 0.72 0.74 0.76 0.78 0.8 0.82 0.84 0.86 0.88 0.9 0.92 0.94 0.96 0.98
Precision, Recall and F-Measure
Precision Recall F1
Precision: How accurate are the obtained results? (Altern.) How many errors do they contain?
Recall: How complete are the obtained results? (Altern.) How many clones have been retrieved w.r.t. Total Clones?
CODESTRUCTURES
PDG NODES AND EDGES
while call-site
argexpr
CODESTRUCTURES
PDG
• Two Types of Nodes
• Control Nodes (Dashed ones)
• e.g., if - for - while - function calls...
• Data Nodes
• e.g., expressions - parameters...
NODES AND EDGES
while call-site
argexpr
CODESTRUCTURES
PDG
• Two Types of Nodes
• Control Nodes (Dashed ones)
• e.g., if - for - while - function calls...
• Data Nodes
• e.g., expressions - parameters...
• Two Types of Edges (i.e., dependencies)
• Control edges (Dashed ones)
• Data edges
NODES AND EDGES
while call-site
argexpr
• Features of nodes:
• Node Label
• i.e., , WHILE, CALL-SITE, EXPR, ...
• Node Type
• i.e., Data Node or Control Node
• Features of edges:
• Edge Type
• i.e., Data Edge or Control Edge
KERNELSFOR CODE
STRUCTURES:PDG
GRAPH KERNELS FOR PDG
while
call-site
arg
expr expr
• Features of nodes:
• Node Label
• i.e., , WHILE, CALL-SITE, EXPR, ...
• Node Type
• i.e., Data Node or Control Node
• Features of edges:
• Edge Type
• i.e., Data Edge or Control Edge
KERNELSFOR CODE
STRUCTURES:PDG
Node Label = WHILENode Type = Control Node
GRAPH KERNELS FOR PDG
while
call-site
arg
expr expr
Control Edge
Data Edge
while
call-site
arg
expr expr
while
call-site
arg
expr call-site
GRAPH KERNELS FOR PDG• Goal: Identify common subgraphs
• Selectors: Compare nodes to each others and explore the subgraphs of only “compatible”
nodes (i.e., Nodes of the same type)
• Context: The subgraph of a node (with paths whose lengths are at most L to avoid loops)
while
call-site
arg
expr expr
while
call-site
arg
expr call-site
GRAPH KERNELS FOR PDG• Goal: Identify common subgraphs
• Selectors: Compare nodes to each others and explore the subgraphs of only “compatible”
nodes (i.e., Nodes of the same type)
• Context: The subgraph of a node (with paths whose lengths are at most L to avoid loops)
while
call-site
arg
expr expr
while
call-site
arg
expr call-site
GRAPH KERNELS FOR PDG• Goal: Identify common subgraphs
• Selectors: Compare nodes to each others and explore the subgraphs of only “compatible”
nodes (i.e., Nodes of the same type)
• Context: The subgraph of a node (with paths whose lengths are at most L to avoid loops)
while
call-site
arg
expr expr
while
call-site
arg
expr call-site
GRAPH KERNELS FOR PDG• Goal: Identify common subgraphs
• Selectors: Compare nodes to each others and explore the subgraphs of only “compatible”
nodes (i.e., Nodes of the same type)
• Context: The subgraph of a node (with paths whose lengths are at most L to avoid loops)
SCEN
ARIO
-BAS
ED
EVAL
UATIO
N
FUTURE RESEARCHDIRECTIONS
PROBLEM
S T A T EM E N T
(MODEL) CLONE DETECTION
Models: models are typically represented visually, as box-and-arrow diagrams,
and the clones we are searching for are similar subgraphs of these diagrams.
Model Granularity: models could be represented at different levels of granularity
(such as the source code) corresponding to different syntactic (and semantic)
units.
Models Clones are categorized in (three) different Types
REFE
RENC
E EX
AMPL
E
TYPE 1C L O N E S
(MODEL) CLONE DETECTION
• Type 1 (exact) model clones: Identical model fragments except for
variations in visual presentation, layout and formatting.
TYPE 2C L O N E S
(MODEL) CLONE DETECTION
Type 2 (renamed) model clones: Structurally identical model fragments except
for variations in labels, values, types, visual presentation, layout and formatting.
model@Friction Mode Logic/Break Apart Detection
model@Friction Mode Logic/Lockup Detection/Required Friction for Lockup
TYPE 3C L O N E S
(MODEL) CLONE DETECTION
Type 3 (near-miss) model clones: Model fragments with further modifications,
such as changes in position or connection with respect to other model fragments and small additions or removals of blocks or lines in addition to variations in labels,
values, types, visual presentation, layout and formatting.
model@Speed.speed_estimation
model@Throttle.throttle_estimation
MO
DELS
AS
SOU
RC
E C
OD
E
THANK YOUValerio MaggioPh.D., University of Naples “Federico II”
valerio.maggio@unina.it
Recommended