28
DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland University

DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

  • View
    221

  • Download
    1

Embed Size (px)

Citation preview

Page 1: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

DynaMineDynaMineFinding Common Error Patterns by Mining Software Revision Histories

Benjamin LivshitsStanford University

Thomas ZimmermannSaarland University

Page 2: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Error Pattern Iceberg

The usual suspects

null dereferences,

buffer overruns, ...

Application

specific

J2EE servlets

Linux code

Device drivers

Page 3: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Co-changed items = patterns

Page 4: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Co-added Method Calls

public void createPartControl(Composite parent) { ... // add listener for editor page activation getSite().getPage().addPartListener(partListener); }

public void dispose() { ... getSite().getPage().removePartListener(partListener); }

Page 5: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Co-added Method Calls

public void createPartControl(Composite parent) { ... // add listener for editor page activation getSite().getPage().addPartListener(partListener); }

public void dispose() { ... getSite().getPage().removePartListener(partListener); }

Page 6: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Co-added Method Calls

public void createPartControl(Composite parent) { ... // add listener for editor page activation getSite().getPage().addPartListener(partListener); }

public void dispose() { ... getSite().getPage().removePartListener(partListener); }

co-added

Page 7: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

How DynaMine Works

report bugs

report patterns

reporting

run the application

post-process

usagepatterns

errorpatterns

unlikelypatterns

dynamic analysis

instrument relevantmethod calls

mine CVS histories

patternsrank and

filterrevision

history mining

Page 8: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Mining Patterns

report bugs

report patterns

reporting

run the application

post-process

usagepatterns

errorpatterns

unlikelypatterns

dynamic analysis

instrument relevantmethod calls

mine CVS histories

patternsrank and

filterrevision

history mining

Page 9: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Mining Method Calls

o1.addListener()o1.removeListener()

Foo.java1.12

o2.addListener()o2.removeListener()System.out.println()

Bar.java1.47

o3.addListener()o3.removeListener()list.iterator()iter.hasNext()iter.next()

Baz.java1.23

o4.addListener()System.out.println()

Qux.java1.41

o4.removeListener()1.42

Page 10: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Finding Pairs

o1.addListener()o1.removeListener()

o2.addListener()o2.removeListener()System.out.println()

o3.addListener()o3.removeListener()list.iterator()iter.hasNext()iter.next()

o4.addListener()System.out.println()

o4.removeListener()

Foo.java1.12

Bar.java1.47

Baz.java1.23

Qux.java1.41

1.42

1 Pair

0 Pairs

1 Pair

2 Pairs

0 Pairs

Page 11: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

o.enterAlignment()o.exitAlignment()o.redoAlignment()iter.hasNext()iter.next()

o.enterAlignment()o.exitAlignment()o.redoAlignment()iter.hasNext()iter.next()

o.enterAlignment()o.exitAlignment()o.redoAlignment()iter.hasNext()iter.next()

o.enterAlignment()o.exitAlignment()o.redoAlignment()iter.hasNext()iter.next()

Finding Patterns

• Find “frequent itemsets” (with Apriori)

{enterAlignment(), exitAlignment(),

redoAlignment()}

\\

Page 12: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Ranking Patterns

• Support count = #occurrences of a pattern

• Confidence = strength of a pattern, P(A|B)

o1.addListener()o1.removeListener()

o2.addListener()o2.removeListener()System.out.println()

o3.addListener()o3.removeListener()list.iterator()iter.hasNext()iter.next()

o4.addListener()System.out.println()

o4.removeListener()

Foo.java1.12

Bar.java1.47

Baz.java1.23

Qux.java1.41

1.42

Page 13: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Ranking Patterns

o1.addListener()o1.removeListener()

o2.addListener()o2.removeListener()System.out.println()

o3.addListener()o3.removeListener()list.iterator()iter.hasNext()iter.next()

o4.addListener()System.out.println()

o4.removeListener()

Foo.java1.12

Bar.java1.47

Baz.java1.23

Qux.java1.41

1.42

This is a fix! Rank removeListener() patterns higher

Page 14: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Investigated Projects

JEDITJEDIT ECLIPSEECLIPSE

sincesince 2000 2001

developersdevelopers 92 112

lines of codelines of code 700,000 2,900,000

revisionsrevisions 40,000 400,000

Page 15: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Simple Method Pairs

GUIs & Listener

Usage pattern

Error pattern

Page 16: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Simple Method Pairs

Locking of Resources

Not hit at runtime

Page 17: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

State Machines in Eclipse

Pretty-printing Usage pattern

Page 18: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

State Machines in Eclipse

Memory context manupilationNot hit at runtime

Page 19: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

State Machines in JEdit

Compound edits (for undo/redo)Usage pattern

Page 20: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Complex Patternstry {

monitor.beginTask(null, Policy.totalWork); int depth = -1;try { workspace.prepareOperation(null, monitor); workspace.beginOperation(true); depth = workspace.getWorkManager().beginUnprotected(); return runInWorkspace (Policy.subMonitorFor(monitor, Policy.opWork,

SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));} catch (OperationCanceledException e) {

workspace.getWorkManager().operationCanceled();return Status.CANCEL_STATUS;

} finally {if (depth >= 0)

workspace.getWorkManager().endUnprotected(depth);workspace.endOperation(null, false,

Policy.subMonitorFor(monitor, Policy.endOpWork));}

} catch (CoreException e) { return e.getStatus();

} finally { monitor.done();

}

Page 21: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Complex Patternstry {

monitor.beginTask(null, Policy.totalWork); int depth = -1;try { workspace.prepareOperation(null, monitor); workspace.beginOperation(true); depth = workspace.getWorkManager().beginUnprotected(); return runInWorkspace (Policy.subMonitorFor(monitor, Policy.opWork,

SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));} catch (OperationCanceledException e) {

workspace.getWorkManager().operationCanceled();return Status.CANCEL_STATUS;

} finally {if (depth >= 0)

workspace.getWorkManager().endUnprotected(depth);workspace.endOperation(null, false,

Policy.subMonitorFor(monitor, Policy.endOpWork));}

} catch (CoreException e) { return e.getStatus();

} finally { monitor.done();

}

Page 22: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Complex Patternstry {

monitor.beginTask(null, Policy.totalWork); int depth = -1;try { workspace.prepareOperation(null, monitor); workspace.beginOperation(true); depth = workspace.getWorkManager().beginUnprotected(); return runInWorkspace (Policy.subMonitorFor(monitor, Policy.opWork,

SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));} catch (OperationCanceledException e) {

workspace.getWorkManager().operationCanceled();return Status.CANCEL_STATUS;

} finally {if (depth >= 0)

workspace.getWorkManager().endUnprotected(depth);workspace.endOperation(null, false,

Policy.subMonitorFor(monitor, Policy.endOpWork));}

} catch (CoreException e) { return e.getStatus();

} finally { monitor.done();

}

Page 23: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Workspace Transactions

S → O*

O → w.prepareOperation()w.beginOperation()U*w.endOperation()

U → w.getWorkManager().beginUnprotected()

S

[w.getWorkManager().operationCanceled()]w.getWorkManager().beginUnprotected()

Usage pattern

Page 24: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Dynamic Validation

report bugs

report patterns

reporting

run the application

post-process

usagepatterns

errorpatterns

unlikelypatterns

dynamic analysis

instrument relevantmethod calls

mine CVS histories

patternsrank and

filterrevision

history mining

Page 25: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Pattern classification

post-processv validations, e violations

usagepatterns

e<v/10

errorpatterns

v/10<=e<=2v

unlikelypatterns

otherwise

Page 26: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Experiments

total 56 patterns

Page 27: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Future Work

• Automatically generate state machines

• Additional patterns by textual matching

• Programmer assist toolsProgrammers who inserted a call to open() inserted a call to close()

Aspect Mining

Page 28: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland

Contibutions

• DynaMine learns usage patterns from large version archives.

• DynaMine ranks patterns effectively, especially for finding error patterns.

DynaMine increases trust in patterns by dynamic analysis