Skip to content

Commit ce13360

Browse files
committed
QL: Cache some predicates
1 parent 27d0af9 commit ce13360

4 files changed

Lines changed: 106 additions & 70 deletions

File tree

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

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@ import ql
22
private import codeql_ql.ast.internal.AstNodes as AstNodes
33
private import codeql_ql.ast.internal.TreeSitter
44

5-
private newtype TContainerOrModule =
6-
TFile(File f) or
7-
TFolder(Folder f) or
8-
TModule(Module m)
9-
105
private class ContainerOrModule extends TContainerOrModule {
116
string getName() { none() }
127

@@ -146,26 +141,43 @@ private predicate resolveSelectionName(Import imp, ContainerOrModule m, int i) {
146141
)
147142
}
148143

149-
/** Holds if import statement `imp` resolves to `m`. */
150-
predicate resolve(Import imp, FileOrModule m) {
151-
exists(int last |
152-
resolveSelectionName(imp, m, last) and
153-
last = count(int j | exists(imp.getSelectionName(j))) - 1
154-
)
155-
}
144+
cached
145+
private module Cached {
146+
cached
147+
module NewType {
148+
cached
149+
newtype TContainerOrModule =
150+
TFile(File f) or
151+
TFolder(Folder f) or
152+
TModule(Module m)
153+
}
156154

157-
/** Holds if module expression `me` resolves to `m`. */
158-
predicate resolveModuleExpr(ModuleExpr me, FileOrModule m) {
159-
not m = TFile(any(File f | f.getExtension() = "ql")) and
160-
not exists(me.getQualifier()) and
161-
definesModule(getEnclosingModule(me).getEnclosing*(), me.getName(), m, _)
162-
or
163-
exists(FileOrModule mid |
164-
resolveModuleExpr(me.getQualifier(), mid) and
165-
definesModule(mid, me.getName(), m, true)
166-
)
155+
/** Holds if import statement `imp` resolves to `m`. */
156+
cached
157+
predicate resolve(Import imp, FileOrModule m) {
158+
exists(int last |
159+
resolveSelectionName(imp, m, last) and
160+
last = count(int j | exists(imp.getSelectionName(j))) - 1
161+
)
162+
}
163+
164+
/** Holds if module expression `me` resolves to `m`. */
165+
cached
166+
predicate resolveModuleExpr(ModuleExpr me, FileOrModule m) {
167+
not m = TFile(any(File f | f.getExtension() = "ql")) and
168+
not exists(me.getQualifier()) and
169+
definesModule(getEnclosingModule(me).getEnclosing*(), me.getName(), m, _)
170+
or
171+
exists(FileOrModule mid |
172+
resolveModuleExpr(me.getQualifier(), mid) and
173+
definesModule(mid, me.getName(), m, true)
174+
)
175+
}
167176
}
168177

178+
import Cached
179+
private import NewType
180+
169181
boolean getPublicBool(AstNode n) {
170182
if n.(ModuleMember).isPrivate() or n.(NewTypeBranch).getNewType().isPrivate()
171183
then result = false

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

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -38,58 +38,73 @@ private predicate definesPredicate(
3838
)
3939
}
4040

41-
predicate resolvePredicateExpr(PredicateExpr pe, ClasslessPredicate p) {
42-
exists(FileOrModule m, boolean public |
43-
not exists(pe.getQualifier()) and
44-
m = getEnclosingModule(pe).getEnclosing*() and
45-
public = [false, true]
46-
or
47-
m = pe.getQualifier().getResolvedModule() and
48-
public = true
49-
|
50-
definesPredicate(m, pe.getName(), count(p.getParameter(_)), p, public)
51-
)
52-
}
41+
cached
42+
private module Cached {
43+
cached
44+
predicate resolvePredicateExpr(PredicateExpr pe, ClasslessPredicate p) {
45+
exists(FileOrModule m, boolean public |
46+
not exists(pe.getQualifier()) and
47+
m = getEnclosingModule(pe).getEnclosing*() and
48+
public = [false, true]
49+
or
50+
m = pe.getQualifier().getResolvedModule() and
51+
public = true
52+
|
53+
definesPredicate(m, pe.getName(), count(p.getParameter(_)), p, public)
54+
)
55+
}
5356

54-
private predicate resolvePredicateCall(PredicateCall pc, PredicateOrBuiltin p) {
55-
exists(Class c, ClassType t |
56-
c = pc.getParent*() and
57-
t = c.getType() and
58-
p = t.getClassPredicate(pc.getPredicateName(), pc.getNumberOfArguments())
59-
)
60-
or
61-
exists(FileOrModule m, boolean public |
62-
not exists(pc.getQualifier()) and
63-
m = getEnclosingModule(pc).getEnclosing*() and
64-
public = [false, true]
57+
private predicate resolvePredicateCall(PredicateCall pc, PredicateOrBuiltin p) {
58+
exists(Class c, ClassType t |
59+
c = pc.getParent*() and
60+
t = c.getType() and
61+
p = t.getClassPredicate(pc.getPredicateName(), pc.getNumberOfArguments())
62+
)
6563
or
66-
m = pc.getQualifier().getResolvedModule() and
67-
public = true
68-
|
69-
definesPredicate(m, pc.getPredicateName(), pc.getNumberOfArguments(), p.getDeclaration(), public)
70-
)
71-
}
64+
exists(FileOrModule m, boolean public |
65+
not exists(pc.getQualifier()) and
66+
m = getEnclosingModule(pc).getEnclosing*() and
67+
public = [false, true]
68+
or
69+
m = pc.getQualifier().getResolvedModule() and
70+
public = true
71+
|
72+
definesPredicate(m, pc.getPredicateName(), pc.getNumberOfArguments(), p.getDeclaration(),
73+
public)
74+
)
75+
}
7276

73-
private predicate resolveMemberCall(MemberCall mc, PredicateOrBuiltin p) {
74-
exists(Type t |
75-
t = mc.getBase().getType() and
76-
p = t.getClassPredicate(mc.getMemberName(), mc.getNumberOfArguments())
77-
)
78-
}
77+
private predicate resolveMemberCall(MemberCall mc, PredicateOrBuiltin p) {
78+
exists(Type t |
79+
t = mc.getBase().getType() and
80+
p = t.getClassPredicate(mc.getMemberName(), mc.getNumberOfArguments())
81+
)
82+
}
7983

80-
predicate resolveCall(Call c, PredicateOrBuiltin p) {
81-
resolvePredicateCall(c, p)
82-
or
83-
resolveMemberCall(c, p)
84-
}
84+
cached
85+
predicate resolveCall(Call c, PredicateOrBuiltin p) {
86+
resolvePredicateCall(c, p)
87+
or
88+
resolveMemberCall(c, p)
89+
}
8590

86-
private newtype TPredOrBuiltin =
87-
TPred(Predicate p) or
88-
TNewTypeBranch(NewTypeBranch b) or
89-
TBuiltinClassless(string ret, string name, string args) { isBuiltinClassless(ret, name, args) } or
90-
TBuiltinMember(string qual, string ret, string name, string args) {
91-
isBuiltinMember(qual, ret, name, args)
91+
cached
92+
module NewTypeDef {
93+
cached
94+
newtype TPredOrBuiltin =
95+
TPred(Predicate p) or
96+
TNewTypeBranch(NewTypeBranch b) or
97+
TBuiltinClassless(string ret, string name, string args) {
98+
isBuiltinClassless(ret, name, args)
99+
} or
100+
TBuiltinMember(string qual, string ret, string name, string args) {
101+
isBuiltinMember(qual, ret, name, args)
102+
}
92103
}
104+
}
105+
106+
import Cached
107+
private import NewTypeDef
93108

94109
class PredicateOrBuiltin extends TPredOrBuiltin {
95110
string getName() { none() }

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ private import codeql_ql.ast.internal.TreeSitter
44
private import codeql_ql.ast.internal.Module
55
private import codeql_ql.ast.internal.Predicate
66

7+
cached
78
private newtype TType =
89
TClass(Class c) { isActualClass(c) } or
910
TNewType(NewType n) or
@@ -257,6 +258,7 @@ class DatabaseType extends Type, TDatabase {
257258
override string getName() { result = name }
258259
}
259260

261+
cached
260262
predicate resolveTypeExpr(TypeExpr te, Type t) {
261263
if te.isDBType()
262264
then t = TDatabase(te.getClassName())

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,16 @@ private string getName(Identifier i) {
6565
)
6666
}
6767

68-
predicate resolveVariable(Identifier i, VarDef decl) { scopeOf(i).containsVar(decl, getName(i)) }
68+
cached
69+
private module Cached {
70+
cached
71+
predicate resolveVariable(Identifier i, VarDef decl) { scopeOf(i).containsVar(decl, getName(i)) }
6972

70-
predicate resolveField(Identifier i, VarDef decl) { scopeOf(i).containsField(decl, getName(i)) }
73+
cached
74+
predicate resolveField(Identifier i, VarDef decl) { scopeOf(i).containsField(decl, getName(i)) }
75+
}
76+
77+
import Cached
7178

7279
module VarConsistency {
7380
query predicate multipleVarDefs(VarAccess v, VarDef decl) {

0 commit comments

Comments
 (0)