mirror of
https://github.com/github/codeql.git
synced 2026-04-28 02:05:14 +02:00
use the explicit super type to resolve calls
This commit is contained in:
@@ -95,15 +95,24 @@ private module Cached {
|
||||
)
|
||||
or
|
||||
// super calls - and `this.method()` calls in charpreds. (Basically: in charpreds there is no difference between super and this.)
|
||||
exists(AstNode sup, ClassType type, Type supertype |
|
||||
exists(AstNode sup, Type supertype |
|
||||
sup instanceof Super
|
||||
or
|
||||
sup.(ThisAccess).getEnclosingPredicate() instanceof CharPred
|
||||
|
|
||||
mc.getBase() = sup and
|
||||
sup.getEnclosingPredicate().getParent().(Class).getType() = type and
|
||||
supertype in [type.getASuperType(), type.getAnInstanceofType()] and
|
||||
p = supertype.getClassPredicate(mc.getMemberName(), mc.getNumberOfArguments())
|
||||
p = supertype.getClassPredicate(mc.getMemberName(), mc.getNumberOfArguments()) and
|
||||
(
|
||||
// super.method()
|
||||
not exists(mc.getSuperType()) and
|
||||
exists(ClassType type |
|
||||
sup.getEnclosingPredicate().getParent().(Class).getType() = type and
|
||||
supertype in [type.getASuperType(), type.getAnInstanceofType()]
|
||||
)
|
||||
or
|
||||
// Class.super.method()
|
||||
supertype = mc.getSuperType().getResolvedType()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -24,3 +24,19 @@ module MyMod {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Super1 extends int {
|
||||
Super1() { this = 42 }
|
||||
|
||||
predicate foo() { any() }
|
||||
}
|
||||
|
||||
class Super2 extends int {
|
||||
Super2() { this = 42 }
|
||||
|
||||
predicate foo() { none() }
|
||||
}
|
||||
|
||||
class Sub extends Super1, Super2 {
|
||||
override predicate foo() { Super1.super.foo() } // <- should resolve to Super1::foo()
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@ getTarget
|
||||
| Foo.qll:38:39:38:67 | MemberCall | file://:0:0:0:0 | regexpCapture |
|
||||
| MultiResolve.qll:14:25:14:35 | PredicateCall | MultiResolve.qll:1:1:4:1 | ClasslessPredicate foo |
|
||||
| MultiResolve.qll:14:25:14:35 | PredicateCall | MultiResolve.qll:12:1:12:24 | ClasslessPredicate myFoo |
|
||||
| MultiResolve.qll:25:7:25:18 | PredicateCall | MultiResolve.qll:17:3:19:3 | ClasslessPredicate bar |
|
||||
| MultiResolve.qll:23:7:23:18 | PredicateCall | MultiResolve.qll:17:3:17:27 | ClasslessPredicate bar |
|
||||
| MultiResolve.qll:41:30:41:47 | MemberCall | MultiResolve.qll:31:3:31:27 | ClassPredicate foo |
|
||||
| Overrides.qll:8:30:8:39 | MemberCall | Overrides.qll:6:3:6:29 | ClassPredicate bar |
|
||||
| Overrides.qll:16:39:16:48 | MemberCall | Overrides.qll:6:3:6:29 | ClassPredicate bar |
|
||||
| Overrides.qll:16:39:16:48 | MemberCall | Overrides.qll:14:12:14:43 | ClassPredicate bar |
|
||||
|
||||
Reference in New Issue
Block a user