File tree Expand file tree Collapse file tree 9 files changed +316
-126
lines changed
test/library-tests/dataflow/dataflow Expand file tree Collapse file tree 9 files changed +316
-126
lines changed Original file line number Diff line number Diff line change @@ -184,7 +184,6 @@ ql/lib/codeql/swift/elements/expr/OverloadedDeclRefExprConstructor.qll 2cf79b483
184
184
ql/lib/codeql/swift/elements/expr/ParenExprConstructor.qll 6baaa592db57870f5ecd9be632bd3f653c44d72581efd41e8a837916e1590f9e 6f28988d04b2cb69ddcb63fba9ae3166b527803a61c250f97e48ff39a28379f6
185
185
ql/lib/codeql/swift/elements/expr/PointerToPointerExpr.qll 921645a373443d050dbc29b9f6bc4a734163c75aeffce453a4f8334b34077d30 54089de77845f6b0e623c537bc25a010ecf1b5c7630b1b4060d2b378abc07f4e
186
186
ql/lib/codeql/swift/elements/expr/PointerToPointerExprConstructor.qll 95cc8003b9a3b2101afb8f110ec4cbd29e380fc048ee080f5047bcf0e14a06c7 114d487a1bb2cd33b27a9c3a47ad1d7254766e169512642f8b09b9c32cf3dc86
187
- ql/lib/codeql/swift/elements/expr/PostfixUnaryExpr.qll a67abdf379f04f1aeee0795cd3ebeb28ed8dfe0efad15b128d44cc9e30b32cbd cbb2b2d54c8e316dc71388ea4ff6bb5d0a6204b4e9d9ce2888e1877a54e85e8f
188
187
ql/lib/codeql/swift/elements/expr/PostfixUnaryExprConstructor.qll c26326e2703b9a8b077ea9f132ae86a76b4010a108b8dcde29864f4206096231 70e45fbe365b63226d0132158cdd453e2e00d740a31c1fb0f7bfb3b2dedfd928
189
188
ql/lib/codeql/swift/elements/expr/PrefixUnaryExprConstructor.qll 6d4c915baf460691cc22681154b1129852c26f1bd9fe3e27b4e162f819d934f5 7971698433bc03dbff2fec34426a96a969fab1a5a575aaf91f10044819e16f6d
190
189
ql/lib/codeql/swift/elements/expr/PropertyWrapperValuePlaceholderExpr.qll 35a61a7f68e71165690127b445fff39780028cb6be5e7b5eadaafa8aeb6b2321 f9e32f65e6d453d3fa857a4d3ca19700be1f8ea2f3d13534656bc21a2fc5f0b0
Original file line number Diff line number Diff line change @@ -148,11 +148,29 @@ private module Cached {
148
148
// flow through `!`
149
149
nodeFrom .asExpr ( ) = nodeTo .asExpr ( ) .( ForceValueExpr ) .getSubExpr ( )
150
150
or
151
- // flow through `?`
151
+ // flow through `?` and `?.`
152
152
nodeFrom .asExpr ( ) = nodeTo .asExpr ( ) .( BindOptionalExpr ) .getSubExpr ( )
153
153
or
154
154
nodeFrom .asExpr ( ) = nodeTo .asExpr ( ) .( OptionalEvaluationExpr ) .getSubExpr ( )
155
155
or
156
+ // flow through nil-coalescing operator `??`
157
+ exists ( BinaryExpr nco |
158
+ nco .getOperator ( ) .( FreeFunctionDecl ) .getName ( ) = "??(_:_:)" and
159
+ nodeTo .asExpr ( ) = nco
160
+ |
161
+ // value argument
162
+ nodeFrom .asExpr ( ) = nco .getAnOperand ( )
163
+ or
164
+ // unpack closure (the second argument is an `AutoClosureExpr` argument)
165
+ nodeFrom .asExpr ( ) = nco .getAnOperand ( ) .( AutoClosureExpr ) .getExpr ( )
166
+ )
167
+ or
168
+ // flow through ternary operator `? :`
169
+ exists ( IfExpr ie |
170
+ nodeTo .asExpr ( ) = ie and
171
+ nodeFrom .asExpr ( ) = ie .getBranch ( _)
172
+ )
173
+ or
156
174
// flow through a flow summary (extension of `SummaryModelCsv`)
157
175
FlowSummaryImpl:: Private:: Steps:: summaryLocalStep ( nodeFrom , nodeTo , true )
158
176
}
Original file line number Diff line number Diff line change 1
1
private import codeql.swift.generated.expr.AutoClosureExpr
2
2
private import codeql.swift.elements.stmt.ReturnStmt
3
+ private import codeql.swift.elements.expr.Expr
3
4
5
+ /**
6
+ * A Swift autoclosure expression, that is, a closure automatically generated
7
+ * around an argument when the parameter has the `@autoclosure` attribute. For
8
+ * example, there is an `AutoClosureExpr` around the value `0` in:
9
+ * ```
10
+ * func myFunction(_ expr: @autoclosure () -> Int) {
11
+ * ...
12
+ * }
13
+ *
14
+ * myFunction(0)
15
+ * ```
16
+ */
4
17
class AutoClosureExpr extends Generated:: AutoClosureExpr {
5
- /** Gets the implicit return statement generated by this autoclosure expression. */
18
+ /**
19
+ * Gets the implicit return statement generated by this autoclosure expression.
20
+ */
6
21
ReturnStmt getReturn ( ) { result = unique( | | this .getBody ( ) .getAnElement ( ) ) }
7
22
23
+ /**
24
+ * Gets the expression returned by this autoclosure expression.
25
+ */
26
+ Expr getExpr ( ) { result = this .getReturn ( ) .getResult ( ) }
27
+
8
28
override string toString ( ) { result = this .getBody ( ) .toString ( ) }
9
29
}
Original file line number Diff line number Diff line change 1
1
private import codeql.swift.generated.expr.BinaryExpr
2
2
private import codeql.swift.elements.expr.Expr
3
+ private import codeql.swift.elements.decl.AbstractFunctionDecl
3
4
5
+ /**
6
+ * A Swift binary expression, that is, an expression that appears between its
7
+ * two operands. For example:
8
+ * ```
9
+ * x + y
10
+ * ```
11
+ */
4
12
class BinaryExpr extends Generated:: BinaryExpr {
13
+ /**
14
+ * Gets the left operand (left expression) of this binary expression.
15
+ */
5
16
Expr getLeftOperand ( ) { result = this .getArgument ( 0 ) .getExpr ( ) }
6
17
18
+ /**
19
+ * Gets the right operand (right expression) of this binary expression.
20
+ */
7
21
Expr getRightOperand ( ) { result = this .getArgument ( 1 ) .getExpr ( ) }
8
22
23
+ /**
24
+ * Gets the operator of this binary expression (the function that is called).
25
+ */
26
+ AbstractFunctionDecl getOperator ( ) { result = this .getStaticTarget ( ) }
27
+
28
+ /**
29
+ * Gets an operand of this binary expression (left or right).
30
+ */
9
31
Expr getAnOperand ( ) { result = [ this .getLeftOperand ( ) , this .getRightOperand ( ) ] }
10
32
11
33
override string toString ( ) { result = "... " + this .getFunction ( ) .toString ( ) + " ..." }
Original file line number Diff line number Diff line change 1
- // generated by codegen/codegen.py, remove this comment if you wish to edit this file
2
1
private import codeql.swift.generated.expr.PostfixUnaryExpr
2
+ private import codeql.swift.elements.expr.Expr
3
+ private import codeql.swift.elements.decl.AbstractFunctionDecl
3
4
4
- class PostfixUnaryExpr extends Generated:: PostfixUnaryExpr { }
5
+ /**
6
+ * A Swift postfix unary expression, that is, a unary expression that appears
7
+ * after its operand. For example:
8
+ * ```
9
+ * x!
10
+ * ```
11
+ */
12
+ class PostfixUnaryExpr extends Generated:: PostfixUnaryExpr {
13
+ /**
14
+ * Gets the operand (expression) of this postfix unary expression.
15
+ */
16
+ Expr getOperand ( ) { result = this .getAnArgument ( ) .getExpr ( ) }
17
+
18
+ /**
19
+ * Gets the operator of this postfix unary expression (the function that is called).
20
+ */
21
+ AbstractFunctionDecl getOperator ( ) { result = this .getStaticTarget ( ) }
22
+ }
Original file line number Diff line number Diff line change 1
1
private import codeql.swift.generated.expr.PrefixUnaryExpr
2
2
private import codeql.swift.elements.expr.Expr
3
+ private import codeql.swift.elements.decl.AbstractFunctionDecl
3
4
5
+ /**
6
+ * A Swift prefix unary expression, that is, a unary expression that appears
7
+ * before its operand. For example:
8
+ * ```
9
+ * -x
10
+ * ```
11
+ */
4
12
class PrefixUnaryExpr extends Generated:: PrefixUnaryExpr {
13
+ /**
14
+ * Gets the operand (expression) of this prefix unary expression.
15
+ */
5
16
Expr getOperand ( ) { result = this .getAnArgument ( ) .getExpr ( ) }
17
+
18
+ /**
19
+ * Gets the operator of this prefix unary expression (the function that is called).
20
+ */
21
+ AbstractFunctionDecl getOperator ( ) { result = this .getStaticTarget ( ) }
6
22
}
You can’t perform that action at this time.
0 commit comments