mirror of
https://github.com/github/codeql.git
synced 2026-02-08 03:01:10 +01:00
improve resolution of buildin predicates (and getAQlClass())
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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*/
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user