@@ -49,18 +49,28 @@ predicate isTriedAgainstException(ControlFlowElement cfe, ExceptionClass ec) {
4949 )
5050}
5151
52+ private class DisposeCall extends MethodCall {
53+ DisposeCall ( ) { this .getTarget ( ) instanceof DisposeMethod }
54+ }
55+
56+ private predicate reachesDisposeCall ( DisposeCall disposeCall , DataFlow:: Node node ) {
57+ DataFlow:: localFlowStep ( node , DataFlow:: exprNode ( disposeCall .getQualifier ( ) ) )
58+ or
59+ exists ( DataFlow:: Node mid | reachesDisposeCall ( disposeCall , mid ) |
60+ DataFlow:: localFlowStep ( node , mid )
61+ )
62+ }
63+
5264/**
5365 * Holds if `disposeCall` disposes the object created by `disposableCreation`.
5466 */
55- predicate disposeReachableFromDisposableCreation ( MethodCall disposeCall , Expr disposableCreation ) {
67+ predicate disposeReachableFromDisposableCreation ( DisposeCall disposeCall , Expr disposableCreation ) {
5668 // The qualifier of the Dispose call flows from something that introduced a disposable into scope
5769 (
5870 disposableCreation instanceof LocalScopeDisposableCreation or
5971 disposableCreation instanceof MethodCall
6072 ) and
61- DataFlow:: localFlowStep + ( DataFlow:: exprNode ( disposableCreation ) ,
62- DataFlow:: exprNode ( disposeCall .getQualifier ( ) ) ) and
63- disposeCall .getTarget ( ) instanceof DisposeMethod
73+ reachesDisposeCall ( disposeCall , DataFlow:: exprNode ( disposableCreation ) )
6474}
6575
6676class MethodCallThatMayThrow extends MethodCall {
@@ -73,7 +83,7 @@ ControlFlowElement getACatchOrFinallyClauseChild() {
7383 result = getACatchOrFinallyClauseChild ( ) .getAChild ( )
7484}
7585
76- from MethodCall disposeCall , Expr disposableCreation , MethodCallThatMayThrow callThatThrows
86+ from DisposeCall disposeCall , Expr disposableCreation , MethodCallThatMayThrow callThatThrows
7787where
7888 disposeReachableFromDisposableCreation ( disposeCall , disposableCreation ) and
7989 // The dispose call is not, itself, within a dispose method.
0 commit comments