From 7955a8b6c803d7bde80b993f917595a825310599 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 13 Oct 2021 13:43:52 +0000 Subject: [PATCH 1/8] Refactor --- ql/src/codeql_ql/ast/Ast.qll | 50 +++++++--- ql/src/codeql_ql/ast/internal/AstNodes.qll | 9 +- ql/src/codeql_ql/ast/internal/Predicate.qll | 104 +++----------------- ql/src/codeql_ql/ast/internal/Type.qll | 3 +- 4 files changed, 59 insertions(+), 107 deletions(-) diff --git a/ql/src/codeql_ql/ast/Ast.qll b/ql/src/codeql_ql/ast/Ast.qll index dad0dec9ae9..b5f3a9dafca 100644 --- a/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/src/codeql_ql/ast/Ast.qll @@ -31,6 +31,20 @@ class AstNode extends TAstNode { ) } + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + if exists(getLocation()) + then getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + else ( + filepath = "" and + startline = 0 and + startcolumn = 0 and + endline = 0 and + endcolumn = 0 + ) + } + /** * Gets the parent in the AST for this node. */ @@ -181,7 +195,7 @@ class Select extends TSelect, AstNode { * A QL predicate. * Either a classless predicate, a class predicate, or a characteristic predicate. */ -class Predicate extends TPredicate, AstNode, Declaration { +class Predicate extends TPredicate, AstNode, PredicateOrBuiltin, Declaration { /** * Gets the body of the predicate. */ @@ -200,7 +214,7 @@ class Predicate extends TPredicate, AstNode, Declaration { /** * Gets the number of parameters. */ - int getArity() { + override int getArity() { not this.(ClasslessPredicate).getAlias() instanceof PredicateExpr and result = count(getParameter(_)) or @@ -209,12 +223,19 @@ class Predicate extends TPredicate, AstNode, Declaration { ) } + /** + * Holds if this predicate is private. + */ + override predicate isPrivate() { hasAnnotation("private") } + /** * Gets the return type (if any) of the predicate. */ TypeExpr getReturnTypeExpr() { none() } - Type getReturnType() { result = this.getReturnTypeExpr().getResolvedType() } + override Type getReturnType() { result = this.getReturnTypeExpr().getResolvedType() } + + override Type getParameterType(int i) { result = this.getParameter(i).getType() } override AstNode getAChild(string pred) { result = super.getAChild(pred) @@ -376,6 +397,8 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati or pred_name = directMember("getReturnTypeExpr") and result = this.getReturnTypeExpr() } + + override predicate isPrivate() { Predicate.super.isPrivate() } } /** @@ -394,11 +417,6 @@ class ClassPredicate extends TClassPredicate, Predicate { override Class getParent() { result.getAClassPredicate() = this } - /** - * Holds if this predicate is private. - */ - predicate isPrivate() { hasAnnotation("private") } - /** * Holds if this predicate is annotated as overriding another predicate. */ @@ -416,7 +434,7 @@ class ClassPredicate extends TClassPredicate, Predicate { /** * Gets the type representing this class. */ - ClassType getDeclaringType() { result.getDeclaration() = getParent() } + override ClassType getDeclaringType() { result.getDeclaration() = getParent() } predicate overrides(ClassPredicate other) { predOverrides(this, other) } @@ -453,7 +471,7 @@ class CharPred extends TCharPred, Predicate { pred_name = directMember("getBody") and result = this.getBody() } - ClassType getDeclaringType() { result.getDeclaration() = getParent() } + override ClassType getDeclaringType() { result.getDeclaration() = getParent() } } /** @@ -764,7 +782,7 @@ class NewType extends TNewType, TypeDeclaration, ModuleDeclaration { * A branch in a `newtype`. * E.g. `Bar()` or `Baz()` in `newtype Foo = Bar() or Baz()`. */ -class NewTypeBranch extends TNewTypeBranch, TypeDeclaration { +class NewTypeBranch extends TNewTypeBranch, PredicateOrBuiltin, TypeDeclaration { Generated::DatatypeBranch branch; NewTypeBranch() { this = TNewTypeBranch(branch) } @@ -786,6 +804,16 @@ class NewTypeBranch extends TNewTypeBranch, TypeDeclaration { /** Gets the body of this branch. */ Formula getBody() { toGenerated(result) = branch.getChild(_).(Generated::Body).getChild() } + override NewTypeBranchType getReturnType() { result.getDeclaration() = this } + + override Type getParameterType(int i) { result = this.getField(i).getType() } + + override int getArity() { result = count(this.getField(_)) } + + override Type getDeclaringType() { none() } + + predicate isPrivate() { this.getNewType().isPrivate() } + override QLDoc getQLDoc() { toGenerated(result) = branch.getChild(_) } NewType getNewType() { result.getABranch() = this } diff --git a/ql/src/codeql_ql/ast/internal/AstNodes.qll b/ql/src/codeql_ql/ast/internal/AstNodes.qll index 5aeffd620ad..89e48335927 100644 --- a/ql/src/codeql_ql/ast/internal/AstNodes.qll +++ b/ql/src/codeql_ql/ast/internal/AstNodes.qll @@ -1,5 +1,6 @@ import codeql_ql.ast.Ast as AST import TreeSitter +private import Builtins cached newtype TAstNode = @@ -65,7 +66,11 @@ newtype TAstNode = TYamlEntry(Generated::YamlEntry ye) or TYamlKey(Generated::YamlKey yk) or TYamlListitem(Generated::YamlListitem yli) or - TYamlValue(Generated::YamlValue yv) + TYamlValue(Generated::YamlValue yv) or + TBuiltinClassless(string ret, string name, string args) { isBuiltinClassless(ret, name, args) } or + TBuiltinMember(string qual, string ret, string name, string args) { + isBuiltinMember(qual, ret, name, args) + } class TFormula = TDisjunction or TConjunction or TComparisonFormula or TQuantifier or TNegation or TIfFormula or @@ -194,6 +199,8 @@ Generated::AstNode toGenerated(AST::AstNode n) { class TPredicate = TCharPred or TClasslessPredicate or TClassPredicate or TDBRelation; +class TPredOrBuiltin = TPredicate or TNewTypeBranch or TBuiltinClassless or TBuiltinMember; + class TModuleMember = TModuleDeclaration or TImport or TSelect or TQLDoc; class TDeclaration = TTypeDeclaration or TModuleDeclaration or TPredicate or TVarDecl; diff --git a/ql/src/codeql_ql/ast/internal/Predicate.qll b/ql/src/codeql_ql/ast/internal/Predicate.qll index 9279b93a4ea..668fd5cb2b0 100644 --- a/ql/src/codeql_ql/ast/internal/Predicate.qll +++ b/ql/src/codeql_ql/ast/internal/Predicate.qll @@ -1,12 +1,11 @@ import ql private import Builtins private import codeql_ql.ast.internal.Module -private import codeql_ql.ast.internal.AstNodes as AstNodes +private import codeql_ql.ast.internal.AstNodes -private class TClasslessPredicateOrNewTypeBranch = - AstNodes::TClasslessPredicate or AstNodes::TNewTypeBranch; +private class TClasslessPredicateOrNewTypeBranch = TClasslessPredicate or TNewTypeBranch; -string getPredicateName(TClasslessPredicateOrNewTypeBranch p) { +private string getPredicateName(TClasslessPredicateOrNewTypeBranch p) { result = p.(ClasslessPredicate).getName() or result = p.(NewTypeBranch).getName() } @@ -69,8 +68,7 @@ private module Cached { m = pc.getQualifier().getResolvedModule() and public = true | - definesPredicate(m, pc.getPredicateName(), pc.getNumberOfArguments(), p.getDeclaration(), - public) + definesPredicate(m, pc.getPredicateName(), pc.getNumberOfArguments(), p, public) ) } @@ -120,49 +118,13 @@ private module Cached { not resolvePredicateCall(c, _) and resolveDBRelation(c, p) } - - cached - module NewTypeDef { - cached - newtype TPredOrBuiltin = - TPred(Predicate p) or - TNewTypeBranch(NewTypeBranch b) or - TBuiltinClassless(string ret, string name, string args) { - isBuiltinClassless(ret, name, args) - } or - TBuiltinMember(string qual, string ret, string name, string args) { - isBuiltinMember(qual, ret, name, args) - } - } } import Cached -private import NewTypeDef -class PredicateOrBuiltin extends TPredOrBuiltin { +class PredicateOrBuiltin extends TPredOrBuiltin, AstNode { string getName() { none() } - string toString() { result = getName() } - - predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - if exists(getDeclaration()) - then - getDeclaration() - .getLocation() - .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - else ( - filepath = "" and - startline = 0 and - startcolumn = 0 and - endline = 0 and - endcolumn = 0 - ) - } - - AstNode getDeclaration() { none() } - Type getDeclaringType() { none() } Type getParameterType(int i) { none() } @@ -174,57 +136,13 @@ class PredicateOrBuiltin extends TPredOrBuiltin { predicate isPrivate() { none() } } -private class DefinedPredicate extends PredicateOrBuiltin, TPred { - Predicate decl; - - DefinedPredicate() { this = TPred(decl) } - - override Predicate getDeclaration() { result = decl } - - override string getName() { result = decl.getName() } - - override Type getReturnType() { result = decl.getReturnType() } - - override Type getParameterType(int i) { result = decl.getParameter(i).getType() } - - // Can be removed when all types can be resolved - override int getArity() { result = decl.getArity() } - - override Type getDeclaringType() { - result = decl.(ClassPredicate).getDeclaringType() - or - result = decl.(CharPred).getDeclaringType() - } - - override predicate isPrivate() { - decl.(ClassPredicate).isPrivate() or decl.(ClassPredicate).isPrivate() - } -} - -private class DefinedNewTypeBranch extends PredicateOrBuiltin, TNewTypeBranch { - NewTypeBranch b; - - DefinedNewTypeBranch() { this = TNewTypeBranch(b) } - - override NewTypeBranch getDeclaration() { result = b } - - override string getName() { result = b.getName() } - - override NewTypeBranchType getReturnType() { result.getDeclaration() = b } - - override Type getParameterType(int i) { result = b.getField(i).getType() } - - // Can be removed when all types can be resolved - override int getArity() { result = count(b.getField(_)) } - - override Type getDeclaringType() { none() } - - override predicate isPrivate() { b.getNewType().isPrivate() } -} - private class TBuiltin = TBuiltinClassless or TBuiltinMember; -class BuiltinPredicate extends PredicateOrBuiltin, TBuiltin { } +class BuiltinPredicate extends PredicateOrBuiltin, TBuiltin { + override string toString() { result = getName() } + + override string getAPrimaryQlClass() { result = "BuiltinPredicate" } +} private class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless { string name; @@ -287,7 +205,7 @@ module PredConsistency { strictcount(PredicateOrBuiltin p0 | resolveCall(call, p0) and // aliases are expected to resolve to multiple. - not exists(p0.getDeclaration().(ClasslessPredicate).getAlias()) + not exists(p0.(ClasslessPredicate).getAlias()) ) and c > 1 and resolveCall(call, p) diff --git a/ql/src/codeql_ql/ast/internal/Type.qll b/ql/src/codeql_ql/ast/internal/Type.qll index 32e1000f426..18ccb7219f7 100644 --- a/ql/src/codeql_ql/ast/internal/Type.qll +++ b/ql/src/codeql_ql/ast/internal/Type.qll @@ -127,8 +127,7 @@ private PredicateOrBuiltin inherClassPredCandidate(Type ty, string name, int ari } predicate predOverrides(ClassPredicate sub, ClassPredicate sup) { - sup = - inherClassPredCandidate(sub.getDeclaringType(), sub.getName(), sub.getArity()).getDeclaration() + sup = inherClassPredCandidate(sub.getDeclaringType(), sub.getName(), sub.getArity()) } private VarDecl declaredField(ClassType ty, string name) { From 41a0bf154f289b3ccf521bda7c709d76aed8d4b0 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 14 Oct 2021 10:48:54 +0200 Subject: [PATCH 2/8] Move some AstNodes to Ast.qll, fix compilation error. --- ql/src/codeql_ql/ast/Ast.qll | 54 ++++++++++++++++++++- ql/src/codeql_ql/ast/internal/AstNodes.qll | 4 +- ql/src/codeql_ql/ast/internal/Predicate.qll | 53 -------------------- ql/test/callgraph/callgraph.ql | 2 +- 4 files changed, 57 insertions(+), 56 deletions(-) diff --git a/ql/src/codeql_ql/ast/Ast.qll b/ql/src/codeql_ql/ast/Ast.qll index b5f3a9dafca..2c93da2af47 100644 --- a/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/src/codeql_ql/ast/Ast.qll @@ -4,6 +4,7 @@ private import codeql_ql.ast.internal.Module private import codeql_ql.ast.internal.Predicate import codeql_ql.ast.internal.Type private import codeql_ql.ast.internal.Variable +private import codeql_ql.ast.internal.Builtins bindingset[name] private string directMember(string name) { result = name + "()" } @@ -191,6 +192,57 @@ class Select extends TSelect, AstNode { override string getAPrimaryQlClass() { result = "Select" } } +class PredicateOrBuiltin extends TPredOrBuiltin, AstNode { + string getName() { none() } + + Type getDeclaringType() { none() } + + Type getParameterType(int i) { none() } + + Type getReturnType() { none() } + + int getArity() { result = count(getParameterType(_)) } + + predicate isPrivate() { none() } +} + +class BuiltinPredicate extends PredicateOrBuiltin, TBuiltin { + override string toString() { result = getName() } + + override string getAPrimaryQlClass() { result = "BuiltinPredicate" } +} + +private class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless { + string name; + string ret; + string args; + + BuiltinClassless() { this = TBuiltinClassless(ret, name, args) } + + override string getName() { result = name } + + override PrimitiveType getReturnType() { result.getName() = ret } + + override PrimitiveType getParameterType(int i) { result.getName() = getArgType(args, i) } +} + +private class BuiltinMember extends BuiltinPredicate, TBuiltinMember { + string name; + string qual; + string ret; + string args; + + BuiltinMember() { this = TBuiltinMember(qual, ret, name, args) } + + override string getName() { result = name } + + override PrimitiveType getReturnType() { result.getName() = ret } + + override PrimitiveType getParameterType(int i) { result.getName() = getArgType(args, i) } + + override PrimitiveType getDeclaringType() { result.getName() = qual } +} + /** * A QL predicate. * Either a classless predicate, a class predicate, or a characteristic predicate. @@ -812,7 +864,7 @@ class NewTypeBranch extends TNewTypeBranch, PredicateOrBuiltin, TypeDeclaration override Type getDeclaringType() { none() } - predicate isPrivate() { this.getNewType().isPrivate() } + override predicate isPrivate() { this.getNewType().isPrivate() } override QLDoc getQLDoc() { toGenerated(result) = branch.getChild(_) } diff --git a/ql/src/codeql_ql/ast/internal/AstNodes.qll b/ql/src/codeql_ql/ast/internal/AstNodes.qll index 89e48335927..c7e73105b4c 100644 --- a/ql/src/codeql_ql/ast/internal/AstNodes.qll +++ b/ql/src/codeql_ql/ast/internal/AstNodes.qll @@ -199,7 +199,9 @@ Generated::AstNode toGenerated(AST::AstNode n) { class TPredicate = TCharPred or TClasslessPredicate or TClassPredicate or TDBRelation; -class TPredOrBuiltin = TPredicate or TNewTypeBranch or TBuiltinClassless or TBuiltinMember; +class TPredOrBuiltin = TPredicate or TNewTypeBranch or TBuiltin; + +class TBuiltin = TBuiltinClassless or TBuiltinMember; class TModuleMember = TModuleDeclaration or TImport or TSelect or TQLDoc; diff --git a/ql/src/codeql_ql/ast/internal/Predicate.qll b/ql/src/codeql_ql/ast/internal/Predicate.qll index 668fd5cb2b0..d6981aeb624 100644 --- a/ql/src/codeql_ql/ast/internal/Predicate.qll +++ b/ql/src/codeql_ql/ast/internal/Predicate.qll @@ -122,59 +122,6 @@ private module Cached { import Cached -class PredicateOrBuiltin extends TPredOrBuiltin, AstNode { - string getName() { none() } - - Type getDeclaringType() { none() } - - Type getParameterType(int i) { none() } - - Type getReturnType() { none() } - - int getArity() { result = count(getParameterType(_)) } - - predicate isPrivate() { none() } -} - -private class TBuiltin = TBuiltinClassless or TBuiltinMember; - -class BuiltinPredicate extends PredicateOrBuiltin, TBuiltin { - override string toString() { result = getName() } - - override string getAPrimaryQlClass() { result = "BuiltinPredicate" } -} - -private class BuiltinClassless extends BuiltinPredicate, TBuiltinClassless { - string name; - string ret; - string args; - - BuiltinClassless() { this = TBuiltinClassless(ret, name, args) } - - override string getName() { result = name } - - override PrimitiveType getReturnType() { result.getName() = ret } - - override PrimitiveType getParameterType(int i) { result.getName() = getArgType(args, i) } -} - -private class BuiltinMember extends BuiltinPredicate, TBuiltinMember { - string name; - string qual; - string ret; - string args; - - BuiltinMember() { this = TBuiltinMember(qual, ret, name, args) } - - override string getName() { result = name } - - override PrimitiveType getReturnType() { result.getName() = ret } - - override PrimitiveType getParameterType(int i) { result.getName() = getArgType(args, i) } - - override PrimitiveType getDeclaringType() { result.getName() = qual } -} - module PredConsistency { query predicate noResolvePredicateExpr(PredicateExpr pe) { not resolvePredicateExpr(pe, _) and diff --git a/ql/test/callgraph/callgraph.ql b/ql/test/callgraph/callgraph.ql index ef5aecf1bbc..4b68e49e361 100644 --- a/ql/test/callgraph/callgraph.ql +++ b/ql/test/callgraph/callgraph.ql @@ -1,3 +1,3 @@ import ql -query AstNode getTarget(Call call) { result = call.getTarget().getDeclaration() } +query AstNode getTarget(Call call) { result = call.getTarget() } From ffc25f8f894b208923e9fc4072d87a09a4ff1f76 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 14 Oct 2021 11:13:04 +0200 Subject: [PATCH 3/8] Fix semantic merge conflict. --- ql/src/codeql_ql/ast/internal/Predicate.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ql/src/codeql_ql/ast/internal/Predicate.qll b/ql/src/codeql_ql/ast/internal/Predicate.qll index d6981aeb624..31c91c7ae6d 100644 --- a/ql/src/codeql_ql/ast/internal/Predicate.qll +++ b/ql/src/codeql_ql/ast/internal/Predicate.qll @@ -91,8 +91,8 @@ private module Cached { rel.getName() = pc.getPredicateName() } - private predicate resolveDBRelation(PredicateCall pc, DefinedPredicate p) { - exists(Relation rel | p = TPred(rel) | + private predicate resolveDBRelation(PredicateCall pc, Predicate p) { + exists(Relation rel | p = rel | candidate(rel, pc) and rel.getArity() = pc.getNumberOfArguments() and ( From ff3aba0f5dbba3dc7a9c18c483f1a93d149f990b Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 14 Oct 2021 11:18:25 +0200 Subject: [PATCH 4/8] Adjust expected output. --- ql/test/printAst/printAst.expected | 78 ++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/ql/test/printAst/printAst.expected b/ql/test/printAst/printAst.expected index bdb784cb67d..7b296161d4d 100644 --- a/ql/test/printAst/printAst.expected +++ b/ql/test/printAst/printAst.expected @@ -171,6 +171,84 @@ nodes | Foo.qll:26:8:26:8 | ComparisonOp | semmle.order | 85 | | Foo.qll:26:10:26:14 | Boolean | semmle.label | [Boolean] Boolean | | Foo.qll:26:10:26:14 | Boolean | semmle.order | 86 | +| file://:0:0:0:0 | abs | semmle.label | [BuiltinPredicate] abs | +| file://:0:0:0:0 | abs | semmle.label | [BuiltinPredicate] abs | +| file://:0:0:0:0 | acos | semmle.label | [BuiltinPredicate] acos | +| file://:0:0:0:0 | any | semmle.label | [BuiltinPredicate] any | +| file://:0:0:0:0 | atan | semmle.label | [BuiltinPredicate] atan | +| file://:0:0:0:0 | bitAnd | semmle.label | [BuiltinPredicate] bitAnd | +| file://:0:0:0:0 | bitNot | semmle.label | [BuiltinPredicate] bitNot | +| file://:0:0:0:0 | bitOr | semmle.label | [BuiltinPredicate] bitOr | +| file://:0:0:0:0 | bitShiftLeft | semmle.label | [BuiltinPredicate] bitShiftLeft | +| file://:0:0:0:0 | bitShiftRight | semmle.label | [BuiltinPredicate] bitShiftRight | +| file://:0:0:0:0 | bitShiftRightSigned | semmle.label | [BuiltinPredicate] bitShiftRightSigned | +| file://:0:0:0:0 | bitXor | semmle.label | [BuiltinPredicate] bitXor | +| file://:0:0:0:0 | booleanAnd | semmle.label | [BuiltinPredicate] booleanAnd | +| file://:0:0:0:0 | booleanNot | semmle.label | [BuiltinPredicate] booleanNot | +| file://:0:0:0:0 | booleanOr | semmle.label | [BuiltinPredicate] booleanOr | +| file://:0:0:0:0 | booleanXor | semmle.label | [BuiltinPredicate] booleanXor | +| file://:0:0:0:0 | ceil | semmle.label | [BuiltinPredicate] ceil | +| file://:0:0:0:0 | charAt | semmle.label | [BuiltinPredicate] charAt | +| file://:0:0:0:0 | copySign | semmle.label | [BuiltinPredicate] copySign | +| file://:0:0:0:0 | cos | semmle.label | [BuiltinPredicate] cos | +| file://:0:0:0:0 | cosh | semmle.label | [BuiltinPredicate] cosh | +| file://:0:0:0:0 | daysTo | semmle.label | [BuiltinPredicate] daysTo | +| 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 | 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 | +| file://:0:0:0:0 | getMonth | semmle.label | [BuiltinPredicate] getMonth | +| file://:0:0:0:0 | getSeconds | semmle.label | [BuiltinPredicate] getSeconds | +| file://:0:0:0:0 | getYear | semmle.label | [BuiltinPredicate] getYear | +| file://:0:0:0:0 | indexOf | semmle.label | [BuiltinPredicate] indexOf | +| file://:0:0:0:0 | indexOf | semmle.label | [BuiltinPredicate] indexOf | +| file://:0:0:0:0 | isLowercase | semmle.label | [BuiltinPredicate] isLowercase | +| file://:0:0:0:0 | isUppercase | semmle.label | [BuiltinPredicate] isUppercase | +| file://:0:0:0:0 | length | semmle.label | [BuiltinPredicate] length | +| file://:0:0:0:0 | log | semmle.label | [BuiltinPredicate] log | +| file://:0:0:0:0 | log | semmle.label | [BuiltinPredicate] log | +| file://:0:0:0:0 | log2 | semmle.label | [BuiltinPredicate] log2 | +| file://:0:0:0:0 | log10 | semmle.label | [BuiltinPredicate] log10 | +| file://:0:0:0:0 | matches | semmle.label | [BuiltinPredicate] matches | +| file://:0:0:0:0 | maximum | semmle.label | [BuiltinPredicate] maximum | +| file://:0:0:0:0 | minimum | semmle.label | [BuiltinPredicate] minimum | +| file://:0:0:0:0 | nextAfter | semmle.label | [BuiltinPredicate] nextAfter | +| file://:0:0:0:0 | nextDown | semmle.label | [BuiltinPredicate] nextDown | +| file://:0:0:0:0 | nextUp | semmle.label | [BuiltinPredicate] nextUp | +| file://:0:0:0:0 | none | semmle.label | [BuiltinPredicate] none | +| file://:0:0:0:0 | pow | semmle.label | [BuiltinPredicate] pow | +| file://:0:0:0:0 | prefix | semmle.label | [BuiltinPredicate] prefix | +| file://:0:0:0:0 | regexpMatch | semmle.label | [BuiltinPredicate] regexpMatch | +| file://:0:0:0:0 | regexpReplaceAll | semmle.label | [BuiltinPredicate] regexpReplaceAll | +| file://:0:0:0:0 | replaceAll | semmle.label | [BuiltinPredicate] replaceAll | +| file://:0:0:0:0 | signum | semmle.label | [BuiltinPredicate] signum | +| file://:0:0:0:0 | sin | semmle.label | [BuiltinPredicate] sin | +| file://:0:0:0:0 | sinh | semmle.label | [BuiltinPredicate] sinh | +| file://:0:0:0:0 | splitAt | semmle.label | [BuiltinPredicate] splitAt | +| file://:0:0:0:0 | splitAt | semmle.label | [BuiltinPredicate] splitAt | +| file://:0:0:0:0 | sqrt | semmle.label | [BuiltinPredicate] sqrt | +| file://:0:0:0:0 | substring | semmle.label | [BuiltinPredicate] substring | +| file://:0:0:0:0 | suffix | semmle.label | [BuiltinPredicate] suffix | +| file://:0:0:0:0 | tan | semmle.label | [BuiltinPredicate] tan | +| file://:0:0:0:0 | tanh | semmle.label | [BuiltinPredicate] tanh | +| file://:0:0:0:0 | toDate | semmle.label | [BuiltinPredicate] toDate | +| file://:0:0:0:0 | toFloat | semmle.label | [BuiltinPredicate] toFloat | +| file://:0:0:0:0 | toISO | semmle.label | [BuiltinPredicate] toISO | +| file://:0:0:0:0 | toInt | semmle.label | [BuiltinPredicate] toInt | +| file://:0:0:0:0 | toLowerCase | semmle.label | [BuiltinPredicate] toLowerCase | +| file://:0:0:0:0 | toString | semmle.label | [BuiltinPredicate] toString | +| file://:0:0:0:0 | toString | semmle.label | [BuiltinPredicate] toString | +| file://:0:0:0:0 | toString | semmle.label | [BuiltinPredicate] toString | +| file://:0:0:0:0 | toString | semmle.label | [BuiltinPredicate] toString | +| file://:0:0:0:0 | toString | semmle.label | [BuiltinPredicate] toString | +| file://:0:0:0:0 | toUnicode | semmle.label | [BuiltinPredicate] toUnicode | +| file://:0:0:0:0 | toUpperCase | semmle.label | [BuiltinPredicate] toUpperCase | +| file://:0:0:0:0 | toUrl | semmle.label | [BuiltinPredicate] toUrl | +| file://:0:0:0:0 | toUrl | semmle.label | [BuiltinPredicate] toUrl | +| file://:0:0:0:0 | trim | semmle.label | [BuiltinPredicate] trim | +| file://:0:0:0:0 | ulp | semmle.label | [BuiltinPredicate] ulp | | printAst.ql:1:1:1:28 | Import | semmle.label | [Import] Import | | printAst.ql:1:1:1:28 | Import | semmle.order | 87 | | printAst.ql:1:1:1:29 | TopLevel | semmle.label | [TopLevel] TopLevel | From 6b4dbc3fe5347b3e2ab160a044a8b51f3dc4a74b Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 14 Oct 2021 11:38:46 +0200 Subject: [PATCH 5/8] Fix compile error. --- ql/src/ide-contextual-queries/Definitions.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ql/src/ide-contextual-queries/Definitions.qll b/ql/src/ide-contextual-queries/Definitions.qll index 2588594f14a..eef1eb9b71d 100644 --- a/ql/src/ide-contextual-queries/Definitions.qll +++ b/ql/src/ide-contextual-queries/Definitions.qll @@ -54,7 +54,7 @@ private predicate resolveField(FieldAccess va, VarDecl decl, string kind) { } private predicate resolveCall(Call c, Predicate p, string kind) { - p = c.getTarget().getDeclaration() and + p = c.getTarget() and kind = "call" } From 350620d44a539fadf795c207c7e84be35dbfc104 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 14 Oct 2021 13:01:38 +0200 Subject: [PATCH 6/8] Fix bad magic. --- ql/src/codeql_ql/ast/internal/Type.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/ql/src/codeql_ql/ast/internal/Type.qll b/ql/src/codeql_ql/ast/internal/Type.qll index 18ccb7219f7..a8b2cfce05f 100644 --- a/ql/src/codeql_ql/ast/internal/Type.qll +++ b/ql/src/codeql_ql/ast/internal/Type.qll @@ -114,6 +114,7 @@ private PredicateOrBuiltin declaredPred(Type ty, string name, int arity) { result.getArity() = arity } +pragma[nomagic] private PredicateOrBuiltin classPredCandidate(Type ty, string name, int arity) { result = declaredPred(ty, name, arity) or From cd3839f621cb7cc812a568990ae6ea20bcf62ec0 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 14 Oct 2021 13:12:11 +0200 Subject: [PATCH 7/8] Fix semantic merge conflict --- ql/src/queries/performance/ClassPredicateDoesntMentionThis.ql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ql/src/queries/performance/ClassPredicateDoesntMentionThis.ql b/ql/src/queries/performance/ClassPredicateDoesntMentionThis.ql index 3bd8237d798..94fe2067486 100644 --- a/ql/src/queries/performance/ClassPredicateDoesntMentionThis.ql +++ b/ql/src/queries/performance/ClassPredicateDoesntMentionThis.ql @@ -19,7 +19,7 @@ predicate usesThis(ClassPredicate pred) { or // implicit this exists(PredicateCall pc | pc.getEnclosingPredicate() = pred | - pc.getTarget().getDeclaration() instanceof ClassPredicate + pc.getTarget() instanceof ClassPredicate ) } @@ -39,7 +39,7 @@ predicate isLiteralComparison(ComparisonFormula eq) { rhs instanceof Literal or exists(NewTypeBranch nt | - rhs.(Call).getTarget().getDeclaration() = nt and + rhs.(Call).getTarget() = nt and count(nt.getField(_)) = 0 ) ) From c0f1d365ba8e91d9d3fa05e8033042259c0a0974 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 14 Oct 2021 13:12:26 +0200 Subject: [PATCH 8/8] This is slightly faster without magic. --- ql/src/codeql_ql/ast/internal/Type.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/ql/src/codeql_ql/ast/internal/Type.qll b/ql/src/codeql_ql/ast/internal/Type.qll index a8b2cfce05f..ee4c5dc8400 100644 --- a/ql/src/codeql_ql/ast/internal/Type.qll +++ b/ql/src/codeql_ql/ast/internal/Type.qll @@ -283,6 +283,7 @@ private predicate qualifier(TypeExpr te, FileOrModule m, boolean public, string ) } +pragma[nomagic] private predicate defines(FileOrModule m, string name, Type t, boolean public) { exists(Class ty | t = TClass(ty) | getEnclosingModule(ty) = m and