![Page 1: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/1.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/2.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/3.jpg)
Co-changed items = patterns
![Page 4: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/4.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/5.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/6.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/7.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/8.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/9.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/10.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/11.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/12.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/13.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/14.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/15.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/16.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/17.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/18.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/19.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/20.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/21.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/22.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/23.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/24.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/25.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/26.jpg)
Experiments
total 56 patterns
![Page 27: DynaMine DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Stanford University Thomas Zimmermann Saarland](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/27.jpg)
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](https://reader037.vdocuments.site/reader037/viewer/2022102818/56649d7e5503460f94a61ad9/html5/thumbnails/28.jpg)
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