@@ -8,9 +8,27 @@ private import semmle.code.java.dataflow.TypeFlow
8
8
private import semmle.code.java.dispatch.internal.Unification
9
9
10
10
private 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
+
11
29
/** Gets a viable implementation of the target of the given `Call`. */
12
30
DataFlowCallable viableCallable ( DataFlowCall c ) {
13
- result .asCallable ( ) = VirtualDispatch :: viableCallable ( c .asCall ( ) )
31
+ result .asCallable ( ) = sourceDispatch ( c .asCall ( ) )
14
32
or
15
33
result .asSummarizedCallable ( ) = c .asCall ( ) .getCallee ( ) .getSourceDeclaration ( )
16
34
}
@@ -22,7 +40,7 @@ private module DispatchImpl {
22
40
*/
23
41
private predicate mayBenefitFromCallContext ( MethodAccess ma , Callable c , int i ) {
24
42
exists ( Parameter p |
25
- 2 <= strictcount ( VirtualDispatch :: viableImpl ( ma ) ) and
43
+ 2 <= strictcount ( sourceDispatch ( ma ) ) and
26
44
ma .getQualifier ( ) .( VarAccess ) .getVariable ( ) = p and
27
45
p .getPosition ( ) = i and
28
46
c .getAParameter ( ) = p and
@@ -31,7 +49,7 @@ private module DispatchImpl {
31
49
)
32
50
or
33
51
exists ( OwnInstanceAccess ia |
34
- 2 <= strictcount ( VirtualDispatch :: viableImpl ( ma ) ) and
52
+ 2 <= strictcount ( sourceDispatch ( ma ) ) and
35
53
( ia .isExplicit ( ma .getQualifier ( ) ) or ia .isImplicitMethodQualifier ( ma ) ) and
36
54
i = - 1 and
37
55
c = ma .getEnclosingCallable ( )
@@ -47,7 +65,7 @@ private module DispatchImpl {
47
65
private predicate relevantContext ( Call ctx , int i ) {
48
66
exists ( Callable c |
49
67
mayBenefitFromCallContext ( _, c , i ) and
50
- c = VirtualDispatch :: viableCallable ( ctx )
68
+ c = sourceDispatch ( ctx )
51
69
)
52
70
}
53
71
0 commit comments