improve resolution of buildin predicates (and getAQlClass())

This commit is contained in:
Erik Krogh Kristensen
2021-10-15 21:23:18 +02:00
parent f8138c92c5
commit 145efa4a1a
4 changed files with 18 additions and 3 deletions

View File

@@ -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;

View File

@@ -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*/
]
}

View File

@@ -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"
}
}

View File

@@ -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 |