diff --git a/ql/src/codeql_ql/ast/Ast.qll b/ql/src/codeql_ql/ast/Ast.qll index 95d6e6a229b..2015496921d 100644 --- a/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/src/codeql_ql/ast/Ast.qll @@ -213,7 +213,7 @@ class BuiltinPredicate extends PredicateOrBuiltin, TBuiltin { override string getAPrimaryQlClass() { result = "BuiltinPredicate" } } -private class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless { +class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless { string name; string ret; string args; @@ -227,7 +227,7 @@ private class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless { override PrimitiveType getParameterType(int i) { result.getName() = getArgType(args, i) } } -private class BuiltinMember extends BuiltinPredicate, TBuiltinMember { +class BuiltinMember extends BuiltinPredicate, TBuiltinMember { string name; string qual; string ret; diff --git a/ql/src/codeql_ql/ast/internal/Builtins.qll b/ql/src/codeql_ql/ast/internal/Builtins.qll index 78b40e56f30..36b00b5eefa 100644 --- a/ql/src/codeql_ql/ast/internal/Builtins.qll +++ b/ql/src/codeql_ql/ast/internal/Builtins.qll @@ -44,7 +44,9 @@ predicate isBuiltinMember(string sig) { "string string.toLowerCase()", "string string.toUpperCase()", "string string.trim()", "int date.daysTo(date)", "int date.getDay()", "int date.getHours()", "int date.getMinutes()", "int date.getMonth()", "int date.getSeconds()", "int date.getYear()", - "string date.toString()", "string date.toISO()", "string int.toUnicode()" + "string date.toString()", "string date.toISO()", "string int.toUnicode()", + "string any.getAQlClass()" + /* getAQlClass is special , see Predicate.qll*/ ] } diff --git a/ql/src/codeql_ql/ast/internal/Predicate.qll b/ql/src/codeql_ql/ast/internal/Predicate.qll index 393ecdf4266..c55a9fb80d1 100644 --- a/ql/src/codeql_ql/ast/internal/Predicate.qll +++ b/ql/src/codeql_ql/ast/internal/Predicate.qll @@ -110,14 +110,26 @@ private module Cached { ) } + private predicate resolveBuildinPredicateCall(PredicateCall call, BuiltinClassless pred) { + call.getNumberOfArguments() = pred.getArity() and + call.getPredicateName() = pred.getName() + } + cached predicate resolveCall(Call c, PredicateOrBuiltin p) { resolvePredicateCall(c, p) or + not resolvePredicateCall(c, _) and + resolveBuildinPredicateCall(c, p) + or resolveMemberCall(c, p) or not resolvePredicateCall(c, _) and resolveDBRelation(c, p) + or + // getAQlClass() is special + c.(MemberCall).getMemberName() = "getAQlClass" and + p.(BuiltinMember).getName() = "getAQlClass" } } diff --git a/ql/test/printAst/printAst.expected b/ql/test/printAst/printAst.expected index 34cd7cf9cc9..6e8f4d30fdd 100644 --- a/ql/test/printAst/printAst.expected +++ b/ql/test/printAst/printAst.expected @@ -196,6 +196,7 @@ nodes | file://:0:0:0:0 | exp | semmle.label | [BuiltinPredicate] exp | | file://:0:0:0:0 | floor | semmle.label | [BuiltinPredicate] floor | | file://:0:0:0:0 | gcd | semmle.label | [BuiltinPredicate] gcd | +| file://:0:0:0:0 | getAQlClass | semmle.label | [BuiltinPredicate] getAQlClass | | file://:0:0:0:0 | getDay | semmle.label | [BuiltinPredicate] getDay | | file://:0:0:0:0 | getHours | semmle.label | [BuiltinPredicate] getHours | | file://:0:0:0:0 | getMinutes | semmle.label | [BuiltinPredicate] getMinutes |