@@ -164,98 +164,115 @@ predicate loopVariablePassedAsArgumentToNonConstReferenceParameter(
164
164
)
165
165
}
166
166
167
- from ForStmt forLoop
167
+ from ForStmt forLoop , Locatable forLoopExpr , string message
168
168
where
169
169
not isExcluded ( forLoop , StatementsPackage:: legacyForStatementsShouldBeSimpleQuery ( ) ) and
170
- /* 1. There is a counter variable that is not of an integer type. */
171
- exists ( Type type | type = forLoop .getAnIterationVariable ( ) .getType ( ) |
172
- not (
173
- type instanceof IntegralType or
174
- type instanceof FixedWidthIntegralType
175
- )
176
- )
177
- or
178
- /*
179
- * 2. The loop condition checks termination without comparing the counter variable and the
180
- * loop bound using a relational operator.
181
- */
170
+ (
171
+ /* 1. There is a counter variable that is not of an integer type. */
172
+ exists ( Type type | type = forLoop .getAnIterationVariable ( ) .getType ( ) |
173
+ not (
174
+ type instanceof IntegralType or
175
+ type instanceof FixedWidthIntegralType
176
+ )
177
+ ) and
178
+ forLoopExpr = forLoop .getAnIterationVariable ( ) and
179
+ message = "The counter variable is not of an integer type."
180
+ or
181
+ /*
182
+ * 2. The loop condition checks termination without comparing the counter variable to the
183
+ * loop bound using a relational operator.
184
+ */
182
185
183
- not forLoop .getCondition ( ) instanceof LegacyForLoopCondition
184
- or
185
- /* 3. The loop counter is mutated somewhere other than its update expression. */
186
- exists ( Variable loopCounter |
187
- isIrregularLoopCounterModification ( forLoop , loopCounter , loopCounter .getAnAccess ( ) )
188
- )
189
- or
190
- /* 4. The type size of the loop counter is not greater or equal to that of the loop counter. */
191
- exists ( LegacyForLoopCondition forLoopCondition | forLoopCondition = forLoop .getCondition ( ) |
192
- exists ( Type loopCounterType , Type loopBoundType |
193
- loopCounterType = forLoopCondition .getLoopCounter ( ) .getType ( ) and
194
- loopBoundType = forLoopCondition .getLoopBound ( ) .getType ( )
195
- |
196
- loopCounterType .getSize ( ) < loopBoundType .getSize ( )
197
- )
198
- )
199
- or
200
- /*
201
- * 5. The loop bound and the loop step are non-const expressions, or are variables that are
202
- * mutated in the for loop.
203
- */
186
+ not forLoop .getCondition ( ) instanceof LegacyForLoopCondition and
187
+ forLoopExpr = forLoop .getCondition ( ) and
188
+ message = "TODO"
189
+ or
190
+ /* 3. The loop counter is mutated somewhere other than its update expression. */
191
+ exists ( Variable loopCounter |
192
+ isIrregularLoopCounterModification ( forLoop , loopCounter , loopCounter .getAnAccess ( ) )
193
+ ) and
194
+ forLoopExpr = forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopCounter ( ) and
195
+ message = "TODO"
196
+ or
197
+ /* 4. The type size of the loop counter is not greater or equal to that of the loop counter. */
198
+ exists ( LegacyForLoopCondition forLoopCondition | forLoopCondition = forLoop .getCondition ( ) |
199
+ exists ( Type loopCounterType , Type loopBoundType |
200
+ loopCounterType = forLoopCondition .getLoopCounter ( ) .getType ( ) and
201
+ loopBoundType = forLoopCondition .getLoopBound ( ) .getType ( )
202
+ |
203
+ loopCounterType .getSize ( ) < loopBoundType .getSize ( )
204
+ )
205
+ ) and
206
+ forLoopExpr = forLoop .getCondition ( ) and
207
+ message = "TODO"
208
+ or
209
+ /*
210
+ * 5. The loop bound and the loop step are non-const expressions, or are variables that are
211
+ * mutated in the for loop.
212
+ */
204
213
205
- /* 5-1. The mutating expression mutates the loop bound. */
206
- exists ( Expr loopBound |
207
- loopBound = forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopBound ( )
208
- |
209
- exists ( Expr mutatingExpr |
210
- /* The mutating expression may be in the loop body. */
211
- mutatingExpr = forLoop .getStmt ( ) .getChildStmt ( ) .getAChild * ( )
212
- or
213
- /* The mutating expression may be in the loop updating expression. */
214
- mutatingExpr = forLoop .getUpdate ( ) .getAChild * ( )
214
+ /* 5-1. The mutating expression mutates the loop bound. */
215
+ exists ( Expr loopBound |
216
+ loopBound = forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopBound ( )
215
217
|
216
- /* 5-1-1. The loop bound is a variable that is mutated in the for loop. */
217
- variableModifiedInExpression ( mutatingExpr ,
218
- loopBound .( VariableAccess ) .getTarget ( ) .getAnAccess ( ) )
219
- or
220
- /* 5-1-2. The loop bound is not a variable access and is not a constant expression. */
221
- not loopBound instanceof VariableAccess and not loopBound .isConstant ( )
222
- )
223
- )
224
- or
225
- /* 5-2. The mutating expression mutates the loop step. */
226
- exists ( Expr loopStep | loopStep = getLoopStepOfForStmt ( forLoop ) |
227
- exists ( Expr mutatingExpr |
228
- /* The mutating expression may be in the loop body. */
229
- mutatingExpr = forLoop .getStmt ( ) .getChildStmt ( ) .getAChild * ( )
230
- or
231
- /* The mutating expression may be in the loop updating expression. */
232
- mutatingExpr = forLoop .getUpdate ( ) .getAChild * ( )
233
- |
234
- /* 5-1-2. The loop step is a variable that is mutated in the for loop. */
235
- variableModifiedInExpression ( mutatingExpr , loopStep .( VariableAccess ) .getTarget ( ) .getAnAccess ( ) )
236
- or
237
- /* 5-1-2. The loop bound is not a variable access and is not a constant expression. */
238
- not loopStep instanceof VariableAccess and not loopStep .isConstant ( )
239
- )
240
- )
241
- or
242
- /*
243
- * 6. Any of the loop counter, loop bound, or a loop step is taken as a mutable reference
244
- * or its address to a mutable pointer.
245
- */
218
+ exists ( Expr mutatingExpr |
219
+ /* The mutating expression may be in the loop body. */
220
+ mutatingExpr = forLoop .getStmt ( ) .getChildStmt ( ) .getAChild * ( )
221
+ or
222
+ /* The mutating expression may be in the loop updating expression. */
223
+ mutatingExpr = forLoop .getUpdate ( ) .getAChild * ( )
224
+ |
225
+ /* 5-1-1. The loop bound is a variable that is mutated in the for loop. */
226
+ variableModifiedInExpression ( mutatingExpr ,
227
+ loopBound .( VariableAccess ) .getTarget ( ) .getAnAccess ( ) )
228
+ or
229
+ /* 5-1-2. The loop bound is not a variable access and is not a constant expression. */
230
+ not loopBound instanceof VariableAccess and not loopBound .isConstant ( )
231
+ )
232
+ ) and
233
+ forLoopExpr = forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopBound ( ) and
234
+ message = "TODO"
235
+ or
236
+ /* 5-2. The mutating expression mutates the loop step. */
237
+ exists ( Expr loopStep | loopStep = getLoopStepOfForStmt ( forLoop ) |
238
+ exists ( Expr mutatingExpr |
239
+ /* The mutating expression may be in the loop body. */
240
+ mutatingExpr = forLoop .getStmt ( ) .getChildStmt ( ) .getAChild * ( )
241
+ or
242
+ /* The mutating expression may be in the loop updating expression. */
243
+ mutatingExpr = forLoop .getUpdate ( ) .getAChild * ( )
244
+ |
245
+ /* 5-1-2. The loop step is a variable that is mutated in the for loop. */
246
+ variableModifiedInExpression ( mutatingExpr ,
247
+ loopStep .( VariableAccess ) .getTarget ( ) .getAnAccess ( ) )
248
+ or
249
+ /* 5-1-2. The loop bound is not a variable access and is not a constant expression. */
250
+ not loopStep instanceof VariableAccess and not loopStep .isConstant ( )
251
+ )
252
+ ) and
253
+ forLoopExpr = getLoopStepOfForStmt ( forLoop ) and
254
+ message = "TODO"
255
+ or
256
+ /*
257
+ * 6. Any of the loop counter, loop bound, or a loop step is taken as a mutable reference
258
+ * or its address to a mutable pointer.
259
+ */
246
260
247
- exists ( VariableAccess loopVariableAccessInCondition |
248
- (
249
- loopVariableAccessInCondition =
250
- forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopCounter ( ) or
251
- loopVariableAccessInCondition = forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopBound ( ) or
252
- loopVariableAccessInCondition = getLoopStepOfForStmt ( forLoop )
261
+ exists ( VariableAccess loopVariableAccessInCondition |
262
+ (
263
+ loopVariableAccessInCondition =
264
+ forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopCounter ( ) or
265
+ loopVariableAccessInCondition =
266
+ forLoop .getCondition ( ) .( LegacyForLoopCondition ) .getLoopBound ( ) or
267
+ loopVariableAccessInCondition = getLoopStepOfForStmt ( forLoop )
268
+ ) and
269
+ (
270
+ loopVariableAssignedToNonConstPointerOrReferenceType ( forLoop , loopVariableAccessInCondition )
271
+ or
272
+ loopVariablePassedAsArgumentToNonConstReferenceParameter ( forLoop ,
273
+ loopVariableAccessInCondition )
274
+ )
253
275
) and
254
- (
255
- loopVariableAssignedToNonConstPointerOrReferenceType ( forLoop , loopVariableAccessInCondition )
256
- or
257
- loopVariablePassedAsArgumentToNonConstReferenceParameter ( forLoop ,
258
- loopVariableAccessInCondition )
259
- )
276
+ message = "TODO"
260
277
)
261
- select forLoop , "TODO "
278
+ select forLoop , message , forLoopExpr , "??? "
0 commit comments