Skip to content

Commit d4b9c36

Browse files
committed
QL: Merge branch 'main' into missing-noinline
2 parents f4d35f6 + 8e1494b commit d4b9c36

4,683 files changed

Lines changed: 716322 additions & 38 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codeql-ql.code-workspace

Lines changed: 0 additions & 14 deletions
This file was deleted.

extractor/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ edition = "2018"
1010
flate2 = "1.0"
1111
node-types = { path = "../node-types" }
1212
tree-sitter = "0.19"
13-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "577c43d96c93915bd7ae9c2765d11be8db102952" }
13+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "36bdc0eae196f9833182ce3f8932be63534121b3" }
1414
clap = "2.33"
1515
tracing = "0.1"
1616
tracing-subscriber = { version = "0.2", features = ["env-filter"] }

generator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ edition = "2018"
1010
node-types = { path = "../node-types" }
1111
tracing = "0.1"
1212
tracing-subscriber = { version = "0.2", features = ["env-filter"] }
13-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "577c43d96c93915bd7ae9c2765d11be8db102952" }
13+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "36bdc0eae196f9833182ce3f8932be63534121b3" }

ql/src/codeql-suites/ql-all.qls

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- description: All Code Scanning queries for QL
2+
- queries: .
3+
- include:
4+
kind:
5+
- problem
6+
- path-problem
7+
- alert
8+
- path-alert

ql/src/codeql-suites/ql-code-scanning.qls

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,13 @@
66
- path-problem
77
- alert
88
- path-alert
9+
precision:
10+
- high
11+
- very-high
12+
problem.severity:
13+
- error
14+
- warning
15+
- exclude:
16+
deprecated: //
17+
- exclude:
18+
query path: /^experimental\/.*/
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
private import ql
2+
private import codeql_ql.ast.internal.Predicate
3+
private import codeql_ql.ast.internal.Type
4+
private import codeql_ql.ast.internal.Builtins
5+
6+
private newtype TValueNumber =
7+
TVariableValueNumber(VarDecl var) { variableAccessValueNumber(_, var) } or
8+
TFieldValueNumber(VarDecl var) { fieldAccessValueNumber(_, var) } or
9+
TThisValueNumber(Predicate pred) { thisAccessValueNumber(_, pred) } or
10+
TPredicateValueNumber(PredicateOrBuiltin pred, ValueNumberArgumentList args) {
11+
predicateCallValueNumber(_, pred, args)
12+
} or
13+
TClassPredicateValueNumber(PredicateOrBuiltin pred, ValueNumber base, ValueNumberArgumentList args) {
14+
classPredicateCallValueNumber(_, pred, base, args)
15+
} or
16+
TLiteralValueNumber(string value, Type t) { literalValueNumber(_, value, t) } or
17+
TBinaryOpValueNumber(FunctionSymbol symbol, ValueNumber leftOperand, ValueNumber rightOperand) {
18+
binaryOperandValueNumber(_, symbol, leftOperand, rightOperand)
19+
} or
20+
TUnaryOpValueNumber(FunctionSymbol symbol, ValueNumber operand) {
21+
unaryOperandValueNumber(_, symbol, operand)
22+
} or
23+
TInlineCastValueNumber(ValueNumber operand, Type t) { inlineCastValueNumber(_, operand, t) } or
24+
TDontCareValueNumber() or
25+
TRangeValueNumber(ValueNumber lower, ValueNumber high) { rangeValueNumber(_, lower, high) } or
26+
TSetValueNumber(ValueNumberElementList elements) { setValueNumber(_, elements) } or
27+
TUniqueValueNumber(Expr e) { uniqueValueNumber(e) }
28+
29+
private newtype ValueNumberArgumentList =
30+
MkArgsNil() or
31+
MkArgsCons(ValueNumber head, ValueNumberArgumentList tail) {
32+
argumentValueNumbers(_, _, head, tail)
33+
}
34+
35+
private newtype ValueNumberElementList =
36+
MkElementsNil() or
37+
MkElementsCons(ValueNumber head, ValueNumberElementList tail) {
38+
setValueNumbers(_, _, head, tail)
39+
}
40+
41+
private ValueNumberArgumentList argumentValueNumbers(Call call, int start) {
42+
start = call.getNumberOfArguments() and
43+
result = MkArgsNil()
44+
or
45+
exists(ValueNumber head, ValueNumberArgumentList tail |
46+
argumentValueNumbers(call, start, head, tail) and
47+
result = MkArgsCons(head, tail)
48+
)
49+
}
50+
51+
private predicate argumentValueNumbers(
52+
Call call, int start, ValueNumber head, ValueNumberArgumentList tail
53+
) {
54+
head = valueNumber(call.getArgument(start)) and
55+
tail = argumentValueNumbers(call, start + 1)
56+
}
57+
58+
private ValueNumberElementList setValueNumbers(Set set, int start) {
59+
start = set.getNumberOfElements() and
60+
result = MkElementsNil()
61+
or
62+
exists(ValueNumber head, ValueNumberElementList tail |
63+
setValueNumbers(set, start, head, tail) and
64+
result = MkElementsCons(head, tail)
65+
)
66+
}
67+
68+
private predicate setValueNumbers(Set set, int start, ValueNumber head, ValueNumberElementList tail) {
69+
head = valueNumber(set.getElement(start)) and
70+
tail = setValueNumbers(set, start + 1)
71+
}
72+
73+
/**
74+
* A value number. A value number represents a collection of expressions that compute to the same value
75+
* at runtime.
76+
*/
77+
class ValueNumber extends TValueNumber {
78+
string toString() { result = "GVN" }
79+
80+
/** Gets an expression that has this value number. */
81+
final Expr getAnExpr() { this = valueNumber(result) }
82+
}
83+
84+
private predicate uniqueValueNumber(Expr e) { not numberable(e) }
85+
86+
private predicate numberable(Expr e) {
87+
e instanceof VarAccess or
88+
e instanceof FieldAccess or
89+
e instanceof ThisAccess or
90+
e instanceof Call or
91+
e instanceof Literal or
92+
e instanceof BinOpExpr or
93+
e instanceof UnaryExpr or
94+
e instanceof InlineCast or
95+
e instanceof ExprAnnotation or
96+
e instanceof DontCare or
97+
e instanceof Range or
98+
e instanceof Set or
99+
e instanceof AsExpr
100+
}
101+
102+
private predicate variableAccessValueNumber(VarAccess access, VarDef var) {
103+
access.getDeclaration() = var
104+
}
105+
106+
private predicate fieldAccessValueNumber(FieldAccess access, VarDef var) {
107+
access.getDeclaration() = var
108+
}
109+
110+
private predicate thisAccessValueNumber(ThisAccess access, Predicate pred) {
111+
access.getEnclosingPredicate() = pred
112+
}
113+
114+
private predicate predicateCallValueNumber(
115+
Call call, PredicateOrBuiltin pred, ValueNumberArgumentList args
116+
) {
117+
call.getTarget() = pred and
118+
not exists(call.(MemberCall).getBase()) and
119+
args = argumentValueNumbers(call, 0)
120+
}
121+
122+
private predicate classPredicateCallValueNumber(
123+
MemberCall call, PredicateOrBuiltin pred, ValueNumber base, ValueNumberArgumentList args
124+
) {
125+
call.getTarget() = pred and
126+
valueNumber(call.getBase()) = base and
127+
args = argumentValueNumbers(call, 0)
128+
}
129+
130+
private predicate literalValueNumber(Literal lit, string value, Type t) {
131+
lit.(String).getValue() = value and
132+
t instanceof StringClass
133+
or
134+
lit.(Integer).getValue().toString() = value and
135+
t instanceof IntClass
136+
or
137+
lit.(Float).getValue().toString() = value and
138+
t instanceof FloatClass
139+
or
140+
lit.(Boolean).isFalse() and
141+
value = "false" and
142+
t instanceof BooleanClass
143+
or
144+
lit.(Boolean).isTrue() and
145+
value = "true" and
146+
t instanceof BooleanClass
147+
}
148+
149+
private predicate binaryOperandValueNumber(
150+
BinOpExpr e, FunctionSymbol symbol, ValueNumber leftOperand, ValueNumber rightOperand
151+
) {
152+
e.getOperator() = symbol and
153+
valueNumber(e.getLeftOperand()) = leftOperand and
154+
valueNumber(e.getRightOperand()) = rightOperand
155+
}
156+
157+
private predicate unaryOperandValueNumber(UnaryExpr e, FunctionSymbol symbol, ValueNumber operand) {
158+
e.getOperator() = symbol and
159+
valueNumber(e.getOperand()) = operand
160+
}
161+
162+
private predicate inlineCastValueNumber(InlineCast cast, ValueNumber operand, Type t) {
163+
valueNumber(cast.getBase()) = operand and
164+
cast.getTypeExpr().getResolvedType() = t
165+
}
166+
167+
private predicate rangeValueNumber(Range range, ValueNumber lower, ValueNumber high) {
168+
valueNumber(range.getLowEndpoint()) = lower and
169+
valueNumber(range.getHighEndpoint()) = high
170+
}
171+
172+
private predicate setValueNumber(Set set, ValueNumberElementList elements) {
173+
elements = setValueNumbers(set, 0)
174+
}
175+
176+
private TValueNumber nonUniqueValueNumber(Expr e) {
177+
exists(VarDecl var |
178+
variableAccessValueNumber(e, var) and
179+
result = TVariableValueNumber(var)
180+
)
181+
or
182+
exists(VarDecl var |
183+
fieldAccessValueNumber(e, var) and
184+
result = TFieldValueNumber(var)
185+
)
186+
or
187+
exists(Predicate pred |
188+
thisAccessValueNumber(e, pred) and
189+
result = TThisValueNumber(pred)
190+
)
191+
or
192+
exists(PredicateOrBuiltin pred, ValueNumberArgumentList args |
193+
predicateCallValueNumber(e, pred, args) and
194+
result = TPredicateValueNumber(pred, args)
195+
)
196+
or
197+
exists(PredicateOrBuiltin pred, ValueNumber base, ValueNumberArgumentList args |
198+
classPredicateCallValueNumber(e, pred, base, args) and
199+
result = TClassPredicateValueNumber(pred, base, args)
200+
)
201+
or
202+
exists(string value, Type t |
203+
literalValueNumber(e, value, t) and
204+
result = TLiteralValueNumber(value, t)
205+
)
206+
or
207+
exists(FunctionSymbol symbol, ValueNumber leftOperand, ValueNumber rightOperand |
208+
binaryOperandValueNumber(e, symbol, leftOperand, rightOperand) and
209+
result = TBinaryOpValueNumber(symbol, leftOperand, rightOperand)
210+
)
211+
or
212+
exists(FunctionSymbol symbol, ValueNumber operand |
213+
unaryOperandValueNumber(e, symbol, operand) and
214+
result = TUnaryOpValueNumber(symbol, operand)
215+
)
216+
or
217+
exists(ValueNumber operand, Type t |
218+
inlineCastValueNumber(e, operand, t) and
219+
result = TInlineCastValueNumber(operand, t)
220+
)
221+
or
222+
result = valueNumber([e.(ExprAnnotation).getExpression(), e.(AsExpr).getInnerExpr()])
223+
or
224+
e instanceof DontCare and result = TDontCareValueNumber()
225+
or
226+
exists(ValueNumber lower, ValueNumber high |
227+
rangeValueNumber(e, lower, high) and
228+
result = TRangeValueNumber(lower, high)
229+
)
230+
or
231+
exists(ValueNumberElementList elements |
232+
setValueNumber(e, elements) and
233+
result = TSetValueNumber(elements)
234+
)
235+
}
236+
237+
/** Gets the value number of an expression `e`. */
238+
cached
239+
TValueNumber valueNumber(Expr e) {
240+
result = nonUniqueValueNumber(e)
241+
or
242+
uniqueValueNumber(e) and
243+
result = TUniqueValueNumber(e)
244+
}

0 commit comments

Comments
 (0)