@@ -8,9 +8,27 @@ private import semmle.code.java.dataflow.TypeFlow
88private import semmle.code.java.dispatch.internal.Unification
99
1010private module DispatchImpl {
11+ private predicate hasHighConfidenceTarget ( Call c ) {
12+ exists ( SummarizedCallable sc |
13+ sc = c .getCallee ( ) .getSourceDeclaration ( ) and not sc .isAutoGenerated ( )
14+ )
15+ or
16+ exists ( Callable srcTgt |
17+ srcTgt = VirtualDispatch:: viableCallable ( c ) and
18+ not VirtualDispatch:: lowConfidenceDispatchTarget ( c , srcTgt )
19+ )
20+ }
21+
22+ private Callable sourceDispatch ( Call c ) {
23+ result = VirtualDispatch:: viableCallable ( c ) and
24+ if VirtualDispatch:: lowConfidenceDispatchTarget ( c , result )
25+ then not hasHighConfidenceTarget ( c )
26+ else any ( )
27+ }
28+
1129 /** Gets a viable implementation of the target of the given `Call`. */
1230 DataFlowCallable viableCallable ( DataFlowCall c ) {
13- result .asCallable ( ) = VirtualDispatch :: viableCallable ( c .asCall ( ) )
31+ result .asCallable ( ) = sourceDispatch ( c .asCall ( ) )
1432 or
1533 result .asSummarizedCallable ( ) = c .asCall ( ) .getCallee ( ) .getSourceDeclaration ( )
1634 }
@@ -22,7 +40,7 @@ private module DispatchImpl {
2240 */
2341 private predicate mayBenefitFromCallContext ( MethodAccess ma , Callable c , int i ) {
2442 exists ( Parameter p |
25- 2 <= strictcount ( VirtualDispatch :: viableImpl ( ma ) ) and
43+ 2 <= strictcount ( sourceDispatch ( ma ) ) and
2644 ma .getQualifier ( ) .( VarAccess ) .getVariable ( ) = p and
2745 p .getPosition ( ) = i and
2846 c .getAParameter ( ) = p and
@@ -31,7 +49,7 @@ private module DispatchImpl {
3149 )
3250 or
3351 exists ( OwnInstanceAccess ia |
34- 2 <= strictcount ( VirtualDispatch :: viableImpl ( ma ) ) and
52+ 2 <= strictcount ( sourceDispatch ( ma ) ) and
3553 ( ia .isExplicit ( ma .getQualifier ( ) ) or ia .isImplicitMethodQualifier ( ma ) ) and
3654 i = - 1 and
3755 c = ma .getEnclosingCallable ( )
@@ -47,7 +65,7 @@ private module DispatchImpl {
4765 private predicate relevantContext ( Call ctx , int i ) {
4866 exists ( Callable c |
4967 mayBenefitFromCallContext ( _, c , i ) and
50- c = VirtualDispatch :: viableCallable ( ctx )
68+ c = sourceDispatch ( ctx )
5169 )
5270 }
5371
0 commit comments