DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin...

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

    22-Dec-2015
  • Category

    Documents

  • view

    222
  • download

    1

Transcript of DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin...

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