Skip to content

Commit 3252c04

Browse files
committed
QL: improve resolution of buildin predicates (and getAQlClass())
1 parent 1239b1a commit 3252c04

File tree

4 files changed

+18
-3
lines changed

4 files changed

+18
-3
lines changed

ql/src/codeql_ql/ast/Ast.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ class BuiltinPredicate extends PredicateOrBuiltin, TBuiltin {
213213
override string getAPrimaryQlClass() { result = "BuiltinPredicate" }
214214
}
215215

216-
private class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless {
216+
class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless {
217217
string name;
218218
string ret;
219219
string args;
@@ -227,7 +227,7 @@ private class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless {
227227
override PrimitiveType getParameterType(int i) { result.getName() = getArgType(args, i) }
228228
}
229229

230-
private class BuiltinMember extends BuiltinPredicate, TBuiltinMember {
230+
class BuiltinMember extends BuiltinPredicate, TBuiltinMember {
231231
string name;
232232
string qual;
233233
string ret;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ predicate isBuiltinMember(string sig) {
4444
"string string.toLowerCase()", "string string.toUpperCase()", "string string.trim()",
4545
"int date.daysTo(date)", "int date.getDay()", "int date.getHours()", "int date.getMinutes()",
4646
"int date.getMonth()", "int date.getSeconds()", "int date.getYear()",
47-
"string date.toString()", "string date.toISO()", "string int.toUnicode()"
47+
"string date.toString()", "string date.toISO()", "string int.toUnicode()",
48+
"string any.getAQlClass()"
49+
/* getAQlClass is special , see Predicate.qll*/
4850
]
4951
}
5052

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,26 @@ private module Cached {
110110
)
111111
}
112112

113+
private predicate resolveBuildinPredicateCall(PredicateCall call, BuiltinClassless pred) {
114+
call.getNumberOfArguments() = pred.getArity() and
115+
call.getPredicateName() = pred.getName()
116+
}
117+
113118
cached
114119
predicate resolveCall(Call c, PredicateOrBuiltin p) {
115120
resolvePredicateCall(c, p)
116121
or
122+
not resolvePredicateCall(c, _) and
123+
resolveBuildinPredicateCall(c, p)
124+
or
117125
resolveMemberCall(c, p)
118126
or
119127
not resolvePredicateCall(c, _) and
120128
resolveDBRelation(c, p)
129+
or
130+
// getAQlClass() is special
131+
c.(MemberCall).getMemberName() = "getAQlClass" and
132+
p.(BuiltinMember).getName() = "getAQlClass"
121133
}
122134
}
123135

ql/test/printAst/printAst.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ nodes
196196
| file://:0:0:0:0 | exp | semmle.label | [BuiltinPredicate] exp |
197197
| file://:0:0:0:0 | floor | semmle.label | [BuiltinPredicate] floor |
198198
| file://:0:0:0:0 | gcd | semmle.label | [BuiltinPredicate] gcd |
199+
| file://:0:0:0:0 | getAQlClass | semmle.label | [BuiltinPredicate] getAQlClass |
199200
| file://:0:0:0:0 | getDay | semmle.label | [BuiltinPredicate] getDay |
200201
| file://:0:0:0:0 | getHours | semmle.label | [BuiltinPredicate] getHours |
201202
| file://:0:0:0:0 | getMinutes | semmle.label | [BuiltinPredicate] getMinutes |

0 commit comments

Comments
 (0)