fix some instances of spuriously resolving to multiple predicates

This commit is contained in:
Erik Krogh Kristensen
2022-06-19 18:59:00 +02:00
parent 1856e2b389
commit 26df367a8a
3 changed files with 36 additions and 2 deletions

View File

@@ -31,7 +31,8 @@ private predicate definesPredicate(
name = alias.getName() and
resolvePredicateExpr(alias.getAlias(), p) and
public = getPublicBool(alias) and
arity = alias.getArity()
arity = alias.getArity() and
arity = p.getArity()
)
)
}
@@ -53,10 +54,12 @@ private module Cached {
}
private predicate resolvePredicateCall(PredicateCall pc, PredicateOrBuiltin p) {
// calls to class methods
exists(Class c, ClassType t |
c = pc.getParent*() and
t = c.getType() and
p = t.getClassPredicate(pc.getPredicateName(), pc.getNumberOfArguments())
p = t.getClassPredicate(pc.getPredicateName(), pc.getNumberOfArguments()) and
not exists(pc.getQualifier()) // no module qualifier, because then it's not a call to a class method.
)
or
exists(FileOrModule m, boolean public |

View File

@@ -0,0 +1,26 @@
predicate foo(int a, int b) {
a = 2 and
b = 2
}
predicate foo(int a, int b, int c) {
a = 2 and
b = 2 and
c = 2
}
predicate myFoo = foo/2;
predicate test(int i) { myFoo(i, i) } // <- should only resolve to the `foo` with 2 arguments (and the `myFoo` alias).
module MyMod {
predicate bar() { any() }
class Bar extends int {
Bar() { this = 42 }
predicate bar() {
MyMod::bar() // <- should resolve to the module's predicate.
}
}
}

View File

@@ -14,6 +14,9 @@ getTarget
| Foo.qll:31:5:31:12 | PredicateCall | Foo.qll:24:3:24:32 | ClasslessPredicate alias0 |
| Foo.qll:36:36:36:65 | MemberCall | file://:0:0:0:0 | replaceAll |
| 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 |
| 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 |
@@ -43,5 +46,7 @@ exprPredicate
| Foo.qll:26:22:26:31 | predicate | Foo.qll:20:3:20:54 | ClasslessPredicate myThing2 |
| Foo.qll:47:55:47:62 | predicate | Foo.qll:42:20:42:27 | NewTypeBranch MkRoot |
| Foo.qll:47:65:47:70 | predicate | Foo.qll:44:9:44:56 | ClasslessPredicate edge |
| MultiResolve.qll:12:19:12:23 | predicate | MultiResolve.qll:1:1:4:1 | ClasslessPredicate foo |
| MultiResolve.qll:12:19:12:23 | predicate | MultiResolve.qll:6:1:10:1 | ClasslessPredicate foo |
| ParamModules.qll:4:18:4:25 | predicate | ParamModules.qll:2:13:2:36 | ClasslessPredicate fooSig |
| ParamModules.qll:10:34:10:40 | predicate | ParamModules.qll:8:3:8:35 | ClasslessPredicate myFoo |