Skip to content

Commit a222757

Browse files
committed
Swift: Add support for pointwise assignment operators.
1 parent 15e3892 commit a222757

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

swift/ql/lib/codeql/swift/elements/expr/AssignExpr.qll

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class Assignment extends Expr {
1313
Assignment() {
1414
this instanceof AssignExpr or
1515
this instanceof AssignArithmeticOperationEx or
16-
this instanceof AssignBitwiseOperationEx
16+
this instanceof AssignBitwiseOperationEx or
17+
this instanceof AssignPointwiseOperationEx
1718
}
1819

1920
/**
@@ -71,7 +72,8 @@ class AssignExpr extends Generated::AssignExpr {
7172
class AssignOperation extends Assignment, BinaryExpr {
7273
AssignOperation() {
7374
this instanceof AssignArithmeticOperationEx or
74-
this instanceof AssignBitwiseOperationEx
75+
this instanceof AssignBitwiseOperationEx or
76+
this instanceof AssignPointwiseOperationEx
7577
}
7678
}
7779

@@ -103,6 +105,19 @@ class AssignBitwiseOperation extends AssignOperation instanceof AssignBitwiseOpe
103105
*/
104106
abstract private class AssignBitwiseOperationEx extends BinaryExpr { }
105107

108+
/**
109+
* A pointwise assignment expression. For example:
110+
* ```
111+
* x .&= y
112+
* ```
113+
*/
114+
class AssignPointwiseOperation extends AssignOperation instanceof AssignPointwiseOperationEx { }
115+
116+
/**
117+
* Private abstract class, extended to define the scope of `AssignPointwiseOperation`.
118+
*/
119+
abstract private class AssignPointwiseOperationEx extends BinaryExpr { }
120+
106121
/**
107122
* An addition assignment expression:
108123
* ```
@@ -227,3 +242,39 @@ class AssignXorExpr extends AssignBitwiseOperationEx {
227242

228243
override string toString() { result = "... ^= ..." }
229244
}
245+
246+
/**
247+
* A pointwise bitwise-and assignment expression:
248+
* ```
249+
* a .&= b
250+
* ```
251+
*/
252+
class AssignPointwiseAndExpr extends AssignPointwiseOperationEx {
253+
AssignPointwiseAndExpr() { this.getOperator().getName() = ".&=(_:_:)" }
254+
255+
override string toString() { result = "... .&= ..." }
256+
}
257+
258+
/**
259+
* A pointwise bitwise-or assignment expression:
260+
* ```
261+
* a .|= b
262+
* ```
263+
*/
264+
class AssignPointwiseOrExpr extends AssignPointwiseOperationEx {
265+
AssignPointwiseOrExpr() { this.getOperator().getName() = ".|=(_:_:)" }
266+
267+
override string toString() { result = "... .|= ..." }
268+
}
269+
270+
/**
271+
* A pointwise bitwise exclusive-or assignment expression:
272+
* ```
273+
* a .^= b
274+
* ```
275+
*/
276+
class AssignPointwiseXorExpr extends AssignPointwiseOperationEx {
277+
AssignPointwiseXorExpr() { this.getOperator().getName() = ".^=(_:_:)" }
278+
279+
override string toString() { result = "... .^= ..." }
280+
}

swift/ql/test/library-tests/elements/expr/assignment/assignment.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@
1515
| assignment.swift:26:2:26:9 | ... <<= ... | AssignBitwiseOperation, AssignLShiftExpr, AssignOperation, Assignment, hasOverflowOperator | &... | 1 |
1616
| assignment.swift:27:2:27:9 | ... >>= ... | AssignBitwiseOperation, AssignOperation, AssignRShiftExpr, Assignment, hasOverflowOperator | &... | 1 |
1717
| assignment.swift:33:2:33:6 | ... = ... | AssignExpr, Assignment | y | z |
18+
| assignment.swift:34:2:34:8 | ... .&= ... | AssignOperation, AssignPointwiseAndExpr, Assignment | &... | m |
19+
| assignment.swift:35:2:35:8 | ... .\|= ... | AssignOperation, AssignPointwiseOrExpr, Assignment | &... | m |
20+
| assignment.swift:36:2:36:8 | ... .^= ... | AssignOperation, AssignPointwiseXorExpr, Assignment | &... | m |

swift/ql/test/library-tests/elements/expr/assignment/assignment.ql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ string describe(Expr e) {
3131
or
3232
e instanceof AssignXorExpr and result = "AssignXorExpr"
3333
or
34+
e instanceof AssignPointwiseAndExpr and result = "AssignPointwiseAndExpr"
35+
or
36+
e instanceof AssignPointwiseOrExpr and result = "AssignPointwiseOrExpr"
37+
or
38+
e instanceof AssignPointwiseXorExpr and result = "AssignPointwiseXorExpr"
39+
or
3440
e.(Assignment).hasOverflowOperator() and result = "hasOverflowOperator"
3541
}
3642

0 commit comments

Comments
 (0)