@@ -37,6 +37,18 @@ class Assignment extends Expr {
37
37
result = this .( AssignExpr ) .getSource ( ) or
38
38
result = this .( AssignOperation ) .getRightOperand ( )
39
39
}
40
+
41
+ /**
42
+ * Holds if this assignment expression uses an overflow operator, that is,
43
+ * an operator that truncates overflow rather than reporting an error.
44
+ * ```
45
+ * x &+= y
46
+ * ```
47
+ */
48
+ predicate hasOverflowOperator ( ) {
49
+ this .( AssignOperation ) .getOperator ( ) .getName ( ) =
50
+ [ "&*=(_:_:)" , "&+=(_:_:)" , "&-=(_:_:)" , "&<<=(_:_:)" , "&>>=(_:_:)" ]
51
+ }
40
52
}
41
53
42
54
/**
@@ -95,10 +107,11 @@ abstract private class AssignBitwiseOperationEx extends BinaryExpr { }
95
107
* An addition assignment expression:
96
108
* ```
97
109
* a += b
110
+ * a &+= b
98
111
* ```
99
112
*/
100
113
class AssignAddExpr extends AssignArithmeticOperationEx {
101
- AssignAddExpr ( ) { this .getOperator ( ) .getName ( ) = "+=(_:_:)" }
114
+ AssignAddExpr ( ) { this .getOperator ( ) .getName ( ) = [ "+=(_:_:)" , "&+=(_:_:)" ] }
102
115
103
116
override string toString ( ) { result = "... += ..." }
104
117
}
@@ -107,10 +120,11 @@ class AssignAddExpr extends AssignArithmeticOperationEx {
107
120
* A subtraction assignment expression:
108
121
* ```
109
122
* a -= b
123
+ * a &-= b
110
124
* ```
111
125
*/
112
126
class AssignSubExpr extends AssignArithmeticOperationEx {
113
- AssignSubExpr ( ) { this .getOperator ( ) .getName ( ) = "-=(_:_:)" }
127
+ AssignSubExpr ( ) { this .getOperator ( ) .getName ( ) = [ "-=(_:_:)" , "&-=(_:_:)" ] }
114
128
115
129
override string toString ( ) { result = "... -= ..." }
116
130
}
@@ -119,10 +133,11 @@ class AssignSubExpr extends AssignArithmeticOperationEx {
119
133
* A multiplication assignment expression:
120
134
* ```
121
135
* a *= b
136
+ * a &*= b
122
137
* ```
123
138
*/
124
139
class AssignMulExpr extends AssignArithmeticOperationEx {
125
- AssignMulExpr ( ) { this .getOperator ( ) .getName ( ) = "*=(_:_:)" }
140
+ AssignMulExpr ( ) { this .getOperator ( ) .getName ( ) = [ "*=(_:_:)" , "&*=(_:_:)" ] }
126
141
127
142
override string toString ( ) { result = "... *= ..." }
128
143
}
@@ -155,10 +170,11 @@ class AssignRemExpr extends AssignArithmeticOperationEx {
155
170
* A left-shift assignment expression:
156
171
* ```
157
172
* a <<= b
173
+ * a &<<= b
158
174
* ```
159
175
*/
160
176
class AssignLShiftExpr extends AssignBitwiseOperationEx {
161
- AssignLShiftExpr ( ) { this .getOperator ( ) .getName ( ) = "<<=(_:_:)" }
177
+ AssignLShiftExpr ( ) { this .getOperator ( ) .getName ( ) = [ "<<=(_:_:)" , "&<<=(_:_:)" ] }
162
178
163
179
override string toString ( ) { result = "... <<= ..." }
164
180
}
@@ -167,10 +183,11 @@ class AssignLShiftExpr extends AssignBitwiseOperationEx {
167
183
* A right-shift assignment expression:
168
184
* ```
169
185
* a >>= b
186
+ * a &>>= b
170
187
* ```
171
188
*/
172
189
class AssignRShiftExpr extends AssignBitwiseOperationEx {
173
- AssignRShiftExpr ( ) { this .getOperator ( ) .getName ( ) = ">>=(_:_:)" }
190
+ AssignRShiftExpr ( ) { this .getOperator ( ) .getName ( ) = [ ">>=(_:_:)" , "&>>=(_:_:)" ] }
174
191
175
192
override string toString ( ) { result = "... >>= ..." }
176
193
}
0 commit comments