@@ -24,10 +24,8 @@ private class ReturnNode extends DataFlow::ExprNode {
2424 }
2525}
2626
27- private class Conf extends DataFlow:: Configuration {
28- Conf ( ) { this = "NoDisposeCallOnLocalIDisposable" }
29-
30- override predicate isSource ( DataFlow:: Node node ) {
27+ module DisposeCallOnLocalIDisposableConfig implements DataFlow:: ConfigSig {
28+ predicate isSource ( DataFlow:: Node node ) {
3129 node .asExpr ( ) =
3230 any ( LocalScopeDisposableCreation disposable |
3331 // Only care about library types - user types often have spurious IDisposable declarations
@@ -37,7 +35,7 @@ private class Conf extends DataFlow::Configuration {
3735 )
3836 }
3937
40- override predicate isSink ( DataFlow:: Node node ) {
38+ predicate isSink ( DataFlow:: Node node ) {
4139 // Things that return may be disposed elsewhere
4240 node instanceof ReturnNode
4341 or
@@ -80,23 +78,27 @@ private class Conf extends DataFlow::Configuration {
8078 )
8179 }
8280
83- override predicate isAdditionalFlowStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
81+ predicate isAdditionalFlowStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
8482 node2 .asExpr ( ) =
8583 any ( LocalScopeDisposableCreation other | other .getAnArgument ( ) = node1 .asExpr ( ) )
8684 }
8785
88- override predicate isBarrierOut ( DataFlow:: Node node ) {
89- this . isSink ( node ) and
86+ predicate isBarrierOut ( DataFlow:: Node node ) {
87+ isSink ( node ) and
9088 not node instanceof ReturnNode
9189 }
9290}
9391
92+ module DisposeCallOnLocalIDisposable = DataFlow:: Global< DisposeCallOnLocalIDisposableConfig > ;
93+
9494/** Holds if `disposable` may not be disposed. */
9595predicate mayNotBeDisposed ( LocalScopeDisposableCreation disposable ) {
96- exists ( Conf conf , DataFlow:: ExprNode e |
96+ exists ( DataFlow:: ExprNode e |
9797 e .getExpr ( ) = disposable and
98- conf .isSource ( e ) and
99- not exists ( DataFlow:: Node sink | conf .hasFlow ( DataFlow:: exprNode ( disposable ) , sink ) |
98+ DisposeCallOnLocalIDisposableConfig:: isSource ( e ) and
99+ not exists ( DataFlow:: Node sink |
100+ DisposeCallOnLocalIDisposable:: flow ( DataFlow:: exprNode ( disposable ) , sink )
101+ |
100102 sink instanceof ReturnNode
101103 implies
102104 sink .getEnclosingCallable ( ) = disposable .getEnclosingCallable ( )
0 commit comments