Skip to content

Commit d813590

Browse files
authored
Merge pull request #11156 from atorralba/atorralba/swift/bitwise-operation
Swift: Add `BitwiseOperation.qll`
2 parents e00585c + 4411852 commit d813590

File tree

9 files changed

+183
-0
lines changed

9 files changed

+183
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
private import codeql.swift.elements.expr.BinaryExpr
2+
private import codeql.swift.elements.expr.Expr
3+
private import codeql.swift.elements.expr.PrefixUnaryExpr
4+
5+
/**
6+
* A bitwise operation, such as:
7+
* ```
8+
* a & b
9+
* ```
10+
*/
11+
class BitwiseOperation extends Expr {
12+
BitwiseOperation() {
13+
this instanceof BinaryBitwiseOperation or
14+
this instanceof UnaryBitwiseOperation
15+
}
16+
17+
/**
18+
* Gets an operand of this bitwise operation.
19+
*/
20+
Expr getAnOperand() {
21+
result =
22+
[this.(BinaryBitwiseOperation).getAnOperand(), this.(UnaryBitwiseOperation).getOperand()]
23+
}
24+
}
25+
26+
/**
27+
* A binary bitwise operation, such as:
28+
* ```
29+
* a & b
30+
* ```
31+
*/
32+
class BinaryBitwiseOperation extends BinaryExpr {
33+
BinaryBitwiseOperation() {
34+
this instanceof AndBitwiseExpr or
35+
this instanceof OrBitwiseExpr or
36+
this instanceof XorBitwiseExpr or
37+
this instanceof ShiftLeftBitwiseExpr or
38+
this instanceof ShiftRightBitwiseExpr
39+
}
40+
}
41+
42+
/**
43+
* A bitwise AND expression.
44+
* ```
45+
* a & b
46+
* ```
47+
*/
48+
class AndBitwiseExpr extends BinaryExpr {
49+
AndBitwiseExpr() { this.getStaticTarget().getName() = "&(_:_:)" }
50+
}
51+
52+
/**
53+
* A bitwise OR expression.
54+
* ```
55+
* a | b
56+
* ```
57+
*/
58+
class OrBitwiseExpr extends BinaryExpr {
59+
OrBitwiseExpr() { this.getStaticTarget().getName() = "|(_:_:)" }
60+
}
61+
62+
/**
63+
* A bitwise XOR expression.
64+
* ```
65+
* a ^ b
66+
* ```
67+
*/
68+
class XorBitwiseExpr extends BinaryExpr {
69+
XorBitwiseExpr() { this.getStaticTarget().getName() = "^(_:_:)" }
70+
}
71+
72+
/**
73+
* A bitwise shift left expression.
74+
* ```
75+
* a << b
76+
* ```
77+
*/
78+
class ShiftLeftBitwiseExpr extends BinaryExpr {
79+
ShiftLeftBitwiseExpr() { this.getStaticTarget().getName() = "<<(_:_:)" }
80+
}
81+
82+
/**
83+
* A bitwise shift right expression.
84+
* ```
85+
* a >> b
86+
* ```
87+
*/
88+
class ShiftRightBitwiseExpr extends BinaryExpr {
89+
ShiftRightBitwiseExpr() { this.getStaticTarget().getName() = ">>(_:_:)" }
90+
}
91+
92+
/**
93+
* A unary bitwise operation, such as:
94+
* ```
95+
* ~a
96+
* ```
97+
*/
98+
class UnaryBitwiseOperation extends PrefixUnaryExpr instanceof NotBitwiseExpr { }
99+
100+
/**
101+
* A bitwise NOT expression.
102+
* ```
103+
* ~a
104+
* ```
105+
*/
106+
class NotBitwiseExpr extends PrefixUnaryExpr {
107+
NotBitwiseExpr() { this.getStaticTarget().getName() = "~(_:)" }
108+
}

swift/ql/lib/swift.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import codeql.swift.elements
44
import codeql.swift.elements.expr.ArithmeticOperation
5+
import codeql.swift.elements.expr.BitwiseOperation
56
import codeql.swift.elements.expr.LogicalOperation
67
import codeql.swift.elements.decl.MethodDecl
78
import codeql.swift.elements.decl.ClassOrStructDecl

swift/ql/test/extractor-tests/expressions/all.expected

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,17 @@
256256
| expressions.swift:161:9:161:9 | .^(_:_:) | MethodRefExpr |
257257
| expressions.swift:161:9:161:9 | Int.Type | TypeExpr |
258258
| expressions.swift:161:11:161:11 | 2 | IntegerLiteralExpr |
259+
| expressions.swift:162:3:162:3 | _ | DiscardAssignmentExpr |
260+
| expressions.swift:162:3:162:12 | ... = ... | AssignExpr |
261+
| expressions.swift:162:7:162:7 | 1 | IntegerLiteralExpr |
262+
| expressions.swift:162:7:162:12 | ... .<<(_:_:) ... | BinaryExpr |
263+
| expressions.swift:162:9:162:9 | .<<(_:_:) | MethodRefExpr |
264+
| expressions.swift:162:9:162:9 | Int.Type | TypeExpr |
265+
| expressions.swift:162:12:162:12 | 0 | IntegerLiteralExpr |
266+
| expressions.swift:163:3:163:3 | _ | DiscardAssignmentExpr |
267+
| expressions.swift:163:3:163:12 | ... = ... | AssignExpr |
268+
| expressions.swift:163:7:163:7 | 1 | IntegerLiteralExpr |
269+
| expressions.swift:163:7:163:12 | ... .>>(_:_:) ... | BinaryExpr |
270+
| expressions.swift:163:9:163:9 | .>>(_:_:) | MethodRefExpr |
271+
| expressions.swift:163:9:163:9 | Int.Type | TypeExpr |
272+
| expressions.swift:163:12:163:12 | 0 | IntegerLiteralExpr |

swift/ql/test/extractor-tests/expressions/expressions.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,6 @@ func bitwise() {
159159
_ = 1 & 2
160160
_ = 1 | 2
161161
_ = 1 ^ 2
162+
_ = 1 << 0
163+
_ = 1 >> 0
162164
}

swift/ql/test/library-tests/ast/PrintAst.expected

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4379,6 +4379,26 @@ expressions.swift:
43794379
# 161| getExpr(): [IntegerLiteralExpr] 1
43804380
# 161| getArgument(1): [Argument] : 2
43814381
# 161| getExpr(): [IntegerLiteralExpr] 2
4382+
# 162| getElement(4): [AssignExpr] ... = ...
4383+
# 162| getDest(): [DiscardAssignmentExpr] _
4384+
# 162| getSource(): [BinaryExpr] ... .<<(_:_:) ...
4385+
# 162| getFunction(): [MethodRefExpr] .<<(_:_:)
4386+
# 162| getBase(): [TypeExpr] Int.Type
4387+
# 162| getTypeRepr(): [TypeRepr] Int
4388+
# 162| getArgument(0): [Argument] : 1
4389+
# 162| getExpr(): [IntegerLiteralExpr] 1
4390+
# 162| getArgument(1): [Argument] : 0
4391+
# 162| getExpr(): [IntegerLiteralExpr] 0
4392+
# 163| getElement(5): [AssignExpr] ... = ...
4393+
# 163| getDest(): [DiscardAssignmentExpr] _
4394+
# 163| getSource(): [BinaryExpr] ... .>>(_:_:) ...
4395+
# 163| getFunction(): [MethodRefExpr] .>>(_:_:)
4396+
# 163| getBase(): [TypeExpr] Int.Type
4397+
# 163| getTypeRepr(): [TypeRepr] Int
4398+
# 163| getArgument(0): [Argument] : 1
4399+
# 163| getExpr(): [IntegerLiteralExpr] 1
4400+
# 163| getArgument(1): [Argument] : 0
4401+
# 163| getExpr(): [IntegerLiteralExpr] 0
43824402
patterns.swift:
43834403
# 1| [ConcreteFuncDecl] basic_patterns()
43844404
# 1| InterfaceType = () -> ()

swift/ql/test/library-tests/ast/expressions.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,6 @@ func bitwise() {
159159
_ = 1 & 2
160160
_ = 1 | 2
161161
_ = 1 ^ 2
162+
_ = 1 << 0
163+
_ = 1 >> 0
162164
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| bitwiseoperation.swift:2:7:2:8 | call to ~(_:) | NotBitwiseExpr, UnaryBitwiseOperation |
2+
| bitwiseoperation.swift:3:7:3:11 | ... .&(_:_:) ... | AndBitwiseExpr, BinaryBitwiseOperation |
3+
| bitwiseoperation.swift:4:7:4:11 | ... .\|(_:_:) ... | BinaryBitwiseOperation, OrBitwiseExpr |
4+
| bitwiseoperation.swift:5:7:5:11 | ... .^(_:_:) ... | BinaryBitwiseOperation, XorBitwiseExpr |
5+
| bitwiseoperation.swift:6:7:6:12 | ... .<<(_:_:) ... | BinaryBitwiseOperation, ShiftLeftBitwiseExpr |
6+
| bitwiseoperation.swift:7:7:7:12 | ... .>>(_:_:) ... | BinaryBitwiseOperation, ShiftRightBitwiseExpr |
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import swift
2+
3+
string describe(BitwiseOperation e) {
4+
e instanceof BinaryBitwiseOperation and result = "BinaryBitwiseOperation"
5+
or
6+
e instanceof AndBitwiseExpr and result = "AndBitwiseExpr"
7+
or
8+
e instanceof OrBitwiseExpr and result = "OrBitwiseExpr"
9+
or
10+
e instanceof XorBitwiseExpr and result = "XorBitwiseExpr"
11+
or
12+
e instanceof ShiftLeftBitwiseExpr and result = "ShiftLeftBitwiseExpr"
13+
or
14+
e instanceof ShiftRightBitwiseExpr and result = "ShiftRightBitwiseExpr"
15+
or
16+
e instanceof UnaryBitwiseOperation and result = "UnaryBitwiseOperation"
17+
or
18+
e instanceof NotBitwiseExpr and result = "NotBitwiseExpr"
19+
}
20+
21+
from BitwiseOperation e
22+
select e, concat(describe(e), ", ")
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
func bitwise() {
2+
_ = ~1
3+
_ = 1 & 2
4+
_ = 1 | 2
5+
_ = 1 ^ 2
6+
_ = 1 << 0
7+
_ = 1 >> 0
8+
}

0 commit comments

Comments
 (0)