Skip to content

Commit f08f02e

Browse files
committed
use the explicit super type to resolve calls
1 parent 1151104 commit f08f02e

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

ql/ql/src/codeql_ql/ast/internal/Predicate.qll

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,24 @@ private module Cached {
9595
)
9696
or
9797
// super calls - and `this.method()` calls in charpreds. (Basically: in charpreds there is no difference between super and this.)
98-
exists(AstNode sup, ClassType type, Type supertype |
98+
exists(AstNode sup, Type supertype |
9999
sup instanceof Super
100100
or
101101
sup.(ThisAccess).getEnclosingPredicate() instanceof CharPred
102102
|
103103
mc.getBase() = sup and
104-
sup.getEnclosingPredicate().getParent().(Class).getType() = type and
105-
supertype in [type.getASuperType(), type.getAnInstanceofType()] and
106-
p = supertype.getClassPredicate(mc.getMemberName(), mc.getNumberOfArguments())
104+
p = supertype.getClassPredicate(mc.getMemberName(), mc.getNumberOfArguments()) and
105+
(
106+
// super.method()
107+
not exists(mc.getSuperType()) and
108+
exists(ClassType type |
109+
sup.getEnclosingPredicate().getParent().(Class).getType() = type and
110+
supertype in [type.getASuperType(), type.getAnInstanceofType()]
111+
)
112+
or
113+
// Class.super.method()
114+
supertype = mc.getSuperType().getResolvedType()
115+
)
107116
)
108117
}
109118

ql/ql/test/callgraph/MultiResolve.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,19 @@ module MyMod {
2424
}
2525
}
2626
}
27+
28+
class Super1 extends int {
29+
Super1() { this = 42 }
30+
31+
predicate foo() { any() }
32+
}
33+
34+
class Super2 extends int {
35+
Super2() { this = 42 }
36+
37+
predicate foo() { none() }
38+
}
39+
40+
class Sub extends Super1, Super2 {
41+
override predicate foo() { Super1.super.foo() } // <- should resolve to Super1::foo()
42+
}

ql/ql/test/callgraph/callgraph.expected

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ getTarget
1616
| Foo.qll:38:39:38:67 | MemberCall | file://:0:0:0:0 | regexpCapture |
1717
| MultiResolve.qll:14:25:14:35 | PredicateCall | MultiResolve.qll:1:1:4:1 | ClasslessPredicate foo |
1818
| MultiResolve.qll:14:25:14:35 | PredicateCall | MultiResolve.qll:12:1:12:24 | ClasslessPredicate myFoo |
19-
| MultiResolve.qll:25:7:25:18 | PredicateCall | MultiResolve.qll:17:3:19:3 | ClasslessPredicate bar |
19+
| MultiResolve.qll:23:7:23:18 | PredicateCall | MultiResolve.qll:17:3:17:27 | ClasslessPredicate bar |
20+
| MultiResolve.qll:41:30:41:47 | MemberCall | MultiResolve.qll:31:3:31:27 | ClassPredicate foo |
2021
| Overrides.qll:8:30:8:39 | MemberCall | Overrides.qll:6:3:6:29 | ClassPredicate bar |
2122
| Overrides.qll:16:39:16:48 | MemberCall | Overrides.qll:6:3:6:29 | ClassPredicate bar |
2223
| Overrides.qll:16:39:16:48 | MemberCall | Overrides.qll:14:12:14:43 | ClassPredicate bar |

0 commit comments

Comments
 (0)