adlint 2.4.10 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,15 +30,10 @@ Feature: W0734
30
30
  | W0104 | 1 | 29 |
31
31
  | W0104 | 1 | 36 |
32
32
  | W0629 | 1 | 13 |
33
- | W0088 | 5 | 17 |
34
33
  | W0734 | 5 | 9 |
35
- | W0088 | 6 | 17 |
36
34
  | W0734 | 6 | 9 |
37
- | W0088 | 7 | 17 |
38
35
  | W0734 | 7 | 9 |
39
- | W0088 | 8 | 17 |
40
36
  | W0734 | 8 | 9 |
41
- | W0088 | 9 | 17 |
42
37
  | W0734 | 9 | 9 |
43
38
  | W0628 | 1 | 13 |
44
39
 
@@ -69,15 +64,11 @@ Feature: W0734
69
64
  | W0104 | 1 | 29 |
70
65
  | W0104 | 1 | 43 |
71
66
  | W0629 | 1 | 13 |
72
- | W0088 | 5 | 17 |
73
67
  | W0734 | 5 | 9 |
74
68
  | W0508 | 6 | 17 |
75
69
  | W0734 | 6 | 9 |
76
- | W0088 | 7 | 17 |
77
70
  | W0734 | 7 | 9 |
78
- | W0088 | 8 | 17 |
79
71
  | W0734 | 8 | 9 |
80
- | W0088 | 9 | 17 |
81
72
  | W0734 | 9 | 9 |
82
73
  | W0108 | 6 | 23 |
83
74
  | W0628 | 1 | 13 |
@@ -109,15 +100,10 @@ Feature: W0734
109
100
  | W0104 | 1 | 29 |
110
101
  | W0104 | 1 | 36 |
111
102
  | W0629 | 1 | 13 |
112
- | W0088 | 5 | 17 |
113
103
  | W0734 | 5 | 9 |
114
- | W0088 | 6 | 17 |
115
104
  | W0734 | 6 | 9 |
116
- | W0088 | 7 | 17 |
117
105
  | W0734 | 7 | 9 |
118
- | W0088 | 8 | 17 |
119
106
  | W0734 | 8 | 9 |
120
- | W0088 | 9 | 17 |
121
107
  | W0734 | 9 | 9 |
122
108
  | W0628 | 1 | 13 |
123
109
 
@@ -148,15 +134,11 @@ Feature: W0734
148
134
  | W0104 | 1 | 29 |
149
135
  | W0104 | 1 | 43 |
150
136
  | W0629 | 1 | 13 |
151
- | W0088 | 5 | 17 |
152
137
  | W0734 | 5 | 9 |
153
138
  | W0508 | 6 | 17 |
154
139
  | W0734 | 6 | 9 |
155
- | W0088 | 7 | 17 |
156
140
  | W0734 | 7 | 9 |
157
- | W0088 | 8 | 17 |
158
141
  | W0734 | 8 | 9 |
159
- | W0088 | 9 | 17 |
160
142
  | W0734 | 9 | 9 |
161
143
  | W0108 | 6 | 23 |
162
144
  | W0628 | 1 | 13 |
@@ -191,15 +173,10 @@ Feature: W0734
191
173
  | W0104 | 1 | 29 |
192
174
  | W0104 | 1 | 36 |
193
175
  | W0629 | 1 | 13 |
194
- | W0088 | 5 | 18 |
195
176
  | W0734 | 5 | 9 |
196
- | W0088 | 6 | 18 |
197
177
  | W0734 | 6 | 9 |
198
- | W0088 | 7 | 17 |
199
178
  | W0734 | 7 | 9 |
200
- | W0088 | 8 | 17 |
201
179
  | W0734 | 8 | 9 |
202
- | W0088 | 9 | 17 |
203
180
  | W0734 | 9 | 9 |
204
181
  | W0628 | 1 | 13 |
205
182
 
@@ -233,15 +210,10 @@ Feature: W0734
233
210
  | W0104 | 1 | 29 |
234
211
  | W0104 | 1 | 36 |
235
212
  | W0629 | 1 | 13 |
236
- | W0088 | 5 | 18 |
237
213
  | W0734 | 5 | 9 |
238
- | W0088 | 6 | 18 |
239
214
  | W0734 | 6 | 9 |
240
- | W0088 | 7 | 17 |
241
215
  | W0734 | 7 | 9 |
242
- | W0088 | 8 | 17 |
243
216
  | W0734 | 8 | 9 |
244
- | W0088 | 9 | 17 |
245
217
  | W0734 | 9 | 9 |
246
218
  | W0628 | 1 | 13 |
247
219
 
@@ -275,15 +247,11 @@ Feature: W0734
275
247
  | W0104 | 1 | 29 |
276
248
  | W0104 | 1 | 43 |
277
249
  | W0629 | 1 | 13 |
278
- | W0088 | 5 | 18 |
279
250
  | W0734 | 5 | 9 |
280
251
  | W0508 | 6 | 18 |
281
252
  | W0734 | 6 | 9 |
282
- | W0088 | 7 | 17 |
283
253
  | W0734 | 7 | 9 |
284
- | W0088 | 8 | 17 |
285
254
  | W0734 | 8 | 9 |
286
- | W0088 | 9 | 17 |
287
255
  | W0734 | 9 | 9 |
288
256
  | W0108 | 6 | 24 |
289
257
  | W0628 | 1 | 13 |
@@ -318,15 +286,11 @@ Feature: W0734
318
286
  | W0104 | 1 | 29 |
319
287
  | W0104 | 1 | 43 |
320
288
  | W0629 | 1 | 13 |
321
- | W0088 | 5 | 18 |
322
289
  | W0734 | 5 | 9 |
323
290
  | W0508 | 6 | 18 |
324
291
  | W0734 | 6 | 9 |
325
- | W0088 | 7 | 17 |
326
292
  | W0734 | 7 | 9 |
327
- | W0088 | 8 | 17 |
328
293
  | W0734 | 8 | 9 |
329
- | W0088 | 9 | 17 |
330
294
  | W0734 | 9 | 9 |
331
295
  | W0108 | 6 | 24 |
332
296
  | W0628 | 1 | 13 |
@@ -30,15 +30,10 @@ Feature: W0735
30
30
  | W0104 | 1 | 29 |
31
31
  | W0104 | 1 | 36 |
32
32
  | W0629 | 1 | 13 |
33
- | W0088 | 5 | 11 |
34
33
  | W0735 | 5 | 14 |
35
- | W0088 | 6 | 11 |
36
34
  | W0735 | 6 | 14 |
37
- | W0088 | 7 | 11 |
38
35
  | W0735 | 7 | 14 |
39
- | W0088 | 8 | 11 |
40
36
  | W0735 | 8 | 14 |
41
- | W0088 | 9 | 11 |
42
37
  | W0735 | 9 | 14 |
43
38
  | W0628 | 1 | 13 |
44
39
 
@@ -69,15 +64,10 @@ Feature: W0735
69
64
  | W0104 | 1 | 36 |
70
65
  | W0104 | 1 | 43 |
71
66
  | W0629 | 1 | 13 |
72
- | W0088 | 5 | 18 |
73
67
  | W0735 | 5 | 21 |
74
- | W0088 | 6 | 17 |
75
68
  | W0735 | 6 | 20 |
76
- | W0088 | 7 | 18 |
77
69
  | W0735 | 7 | 21 |
78
- | W0088 | 8 | 17 |
79
70
  | W0735 | 8 | 20 |
80
- | W0088 | 9 | 18 |
81
71
  | W0735 | 9 | 21 |
82
72
  | W0108 | 6 | 12 |
83
73
  | W0628 | 1 | 13 |
@@ -109,15 +99,10 @@ Feature: W0735
109
99
  | W0104 | 1 | 29 |
110
100
  | W0104 | 1 | 36 |
111
101
  | W0629 | 1 | 13 |
112
- | W0088 | 5 | 11 |
113
102
  | W0735 | 5 | 14 |
114
- | W0088 | 6 | 11 |
115
103
  | W0735 | 6 | 14 |
116
- | W0088 | 7 | 11 |
117
104
  | W0735 | 7 | 14 |
118
- | W0088 | 8 | 11 |
119
105
  | W0735 | 8 | 14 |
120
- | W0088 | 9 | 11 |
121
106
  | W0735 | 9 | 14 |
122
107
  | W0628 | 1 | 13 |
123
108
 
@@ -148,15 +133,10 @@ Feature: W0735
148
133
  | W0104 | 1 | 36 |
149
134
  | W0104 | 1 | 43 |
150
135
  | W0629 | 1 | 13 |
151
- | W0088 | 5 | 18 |
152
136
  | W0735 | 5 | 21 |
153
- | W0088 | 6 | 17 |
154
137
  | W0735 | 6 | 20 |
155
- | W0088 | 7 | 18 |
156
138
  | W0735 | 7 | 21 |
157
- | W0088 | 8 | 17 |
158
139
  | W0735 | 8 | 20 |
159
- | W0088 | 9 | 18 |
160
140
  | W0735 | 9 | 21 |
161
141
  | W0108 | 6 | 12 |
162
142
  | W0628 | 1 | 13 |
@@ -191,15 +171,10 @@ Feature: W0735
191
171
  | W0104 | 1 | 29 |
192
172
  | W0104 | 1 | 36 |
193
173
  | W0629 | 1 | 13 |
194
- | W0088 | 5 | 11 |
195
174
  | W0735 | 5 | 14 |
196
- | W0088 | 6 | 11 |
197
175
  | W0735 | 6 | 14 |
198
- | W0088 | 7 | 11 |
199
176
  | W0735 | 7 | 14 |
200
- | W0088 | 8 | 11 |
201
177
  | W0735 | 8 | 14 |
202
- | W0088 | 9 | 11 |
203
178
  | W0735 | 9 | 14 |
204
179
  | W0628 | 1 | 13 |
205
180
 
@@ -233,15 +208,10 @@ Feature: W0735
233
208
  | W0104 | 1 | 29 |
234
209
  | W0104 | 1 | 36 |
235
210
  | W0629 | 1 | 13 |
236
- | W0088 | 5 | 11 |
237
211
  | W0735 | 5 | 14 |
238
- | W0088 | 6 | 11 |
239
212
  | W0735 | 6 | 14 |
240
- | W0088 | 7 | 11 |
241
213
  | W0735 | 7 | 14 |
242
- | W0088 | 8 | 11 |
243
214
  | W0735 | 8 | 14 |
244
- | W0088 | 9 | 11 |
245
215
  | W0735 | 9 | 14 |
246
216
  | W0628 | 1 | 13 |
247
217
 
@@ -275,15 +245,10 @@ Feature: W0735
275
245
  | W0104 | 1 | 36 |
276
246
  | W0104 | 1 | 43 |
277
247
  | W0629 | 1 | 13 |
278
- | W0088 | 5 | 18 |
279
248
  | W0735 | 5 | 21 |
280
- | W0088 | 6 | 17 |
281
249
  | W0735 | 6 | 20 |
282
- | W0088 | 7 | 18 |
283
250
  | W0735 | 7 | 21 |
284
- | W0088 | 8 | 17 |
285
251
  | W0735 | 8 | 20 |
286
- | W0088 | 9 | 18 |
287
252
  | W0735 | 9 | 21 |
288
253
  | W0108 | 6 | 12 |
289
254
  | W0628 | 1 | 13 |
@@ -318,15 +283,10 @@ Feature: W0735
318
283
  | W0104 | 1 | 36 |
319
284
  | W0104 | 1 | 43 |
320
285
  | W0629 | 1 | 13 |
321
- | W0088 | 5 | 18 |
322
286
  | W0735 | 5 | 21 |
323
- | W0088 | 6 | 17 |
324
287
  | W0735 | 6 | 20 |
325
- | W0088 | 7 | 18 |
326
288
  | W0735 | 7 | 21 |
327
- | W0088 | 8 | 17 |
328
289
  | W0735 | 8 | 20 |
329
- | W0088 | 9 | 18 |
330
290
  | W0735 | 9 | 21 |
331
291
  | W0108 | 6 | 12 |
332
292
  | W0628 | 1 | 13 |
@@ -23,6 +23,7 @@ Feature: W0745
23
23
  | mesg | line | column |
24
24
  | W0118 | 1 | 12 |
25
25
  | W0117 | 3 | 5 |
26
+ | W0723 | 6 | 21 |
26
27
  | W0745 | 6 | 21 |
27
28
  | W0100 | 6 | 13 |
28
29
  | W0104 | 3 | 13 |
@@ -182,3 +182,88 @@ Feature: W9003
182
182
  | W0031 | 3 | 13 |
183
183
  | W0104 | 3 | 13 |
184
184
  | W0628 | 3 | 5 |
185
+
186
+ Scenario: implicit conversion to void pointer
187
+ Given a target source named "fixture.c" with:
188
+ """
189
+ typedef struct foo { int i; } foo_t;
190
+ extern void foo(foo_t *);
191
+
192
+ typedef struct bar { int i; } bar_t;
193
+ extern void bar(bar_t *);
194
+
195
+ extern void baz(void *);
196
+
197
+ static void qux(foo_t *f, bar_t *b)
198
+ {
199
+ foo(b); /* W9003 */
200
+ bar(f); /* W9003 */
201
+ foo(f); /* OK */
202
+ baz(f); /* OK */
203
+ }
204
+ """
205
+ When I successfully run `adlint fixture.c` on noarch
206
+ Then the output should exactly match with:
207
+ | mesg | line | column |
208
+ | W0118 | 2 | 13 |
209
+ | W0118 | 5 | 13 |
210
+ | W0118 | 7 | 13 |
211
+ | W1076 | 9 | 13 |
212
+ | W9003 | 11 | 9 |
213
+ | W9003 | 12 | 9 |
214
+ | W0104 | 9 | 24 |
215
+ | W0104 | 9 | 34 |
216
+ | W0105 | 9 | 24 |
217
+ | W0105 | 9 | 34 |
218
+ | W0629 | 9 | 13 |
219
+ | W0628 | 9 | 13 |
220
+
221
+ Scenario: implicit convertion from void pointer
222
+ Given a target source named "fixture.c" with:
223
+ """
224
+ typedef struct foo { int i; } foo_t;
225
+ extern void *foo(foo_t *);
226
+
227
+ static void bar(void *p)
228
+ {
229
+ foo_t *f = foo(p); /* legal but W9003 */
230
+ }
231
+ """
232
+ When I successfully run `adlint fixture.c` on noarch
233
+ Then the output should exactly match with:
234
+ | mesg | line | column |
235
+ | W0118 | 2 | 14 |
236
+ | W1076 | 4 | 13 |
237
+ | W9003 | 6 | 20 |
238
+ | W9003 | 6 | 19 |
239
+ | W0100 | 6 | 12 |
240
+ | W0104 | 4 | 23 |
241
+ | W0105 | 4 | 23 |
242
+ | W0629 | 4 | 13 |
243
+ | W0628 | 4 | 13 |
244
+
245
+ Scenario: implicit convertion of constant pointer
246
+ Given a target source named "fixture.c" with:
247
+ """
248
+ static void foo(void *p)
249
+ {
250
+ int *p1 = NULL; /* OK */
251
+ int *p2 = 0; /* OK */
252
+ int *p3 = p; /* legal but W9003 */
253
+ int *p4 = 3; /* W9003 */
254
+ }
255
+ """
256
+ When I successfully run `adlint fixture.c` on noarch
257
+ Then the output should exactly match with:
258
+ | mesg | line | column |
259
+ | W1076 | 1 | 13 |
260
+ | W9003 | 5 | 15 |
261
+ | W9003 | 6 | 15 |
262
+ | W0100 | 3 | 10 |
263
+ | W0100 | 4 | 10 |
264
+ | W0100 | 5 | 10 |
265
+ | W0100 | 6 | 10 |
266
+ | W0104 | 1 | 23 |
267
+ | W0105 | 1 | 23 |
268
+ | W0629 | 1 | 13 |
269
+ | W0628 | 1 | 13 |
data/lib/adlint/c/conv.rb CHANGED
@@ -86,6 +86,33 @@ module C #:nodoc:
86
86
  end
87
87
  end
88
88
 
89
+ def untyped_pointer_conversion?(from_type, to_type, from_value)
90
+ return false unless to_type.pointer?
91
+
92
+ # NOTE: Untyped pointer conversion is defined as below;
93
+ #
94
+ # from_type | to_type | result
95
+ # ------------------+------------------+-----------------
96
+ # void pointer | void pointer | true
97
+ # void pointer | non-void pointer | true
98
+ # non-void pointer | void pointer | true
99
+ # non-void pointer | non-void pointer | false
100
+ # non-enum integer | void pointer | from_value == 0
101
+ # non-enum integer | non-void pointer | from_value == 0
102
+ # enum | void pointer | false
103
+ # enum | non-void pointer | false
104
+ # other | void pointer | true
105
+ # other | non-void pointer | false
106
+ case
107
+ when from_type.pointer?
108
+ void_pointer?(from_type) || void_pointer?(to_type)
109
+ when from_type.integer?
110
+ !from_type.enum? && from_value.must_be_equal_to?(ScalarValue.of(0))
111
+ else
112
+ void_pointer?(to_type)
113
+ end
114
+ end
115
+
89
116
  private
90
117
  def wrap_around_value(original, to_type)
91
118
  return original.value unless original.type.scalar? && to_type.scalar?
@@ -105,6 +132,11 @@ module C #:nodoc:
105
132
 
106
133
  original.value
107
134
  end
135
+
136
+ def void_pointer?(type)
137
+ unqualified_type = type.unqualify
138
+ unqualified_type.pointer? && unqualified_type.base_type.void?
139
+ end
108
140
  end
109
141
 
110
142
  # Host class of this module must include StandardTypeCatalogAccessor.
@@ -314,6 +314,14 @@ module C #:nodoc:
314
314
  :assignment_expression, :lhs_variable,
315
315
  :rhs_variable
316
316
 
317
+ # NOTE: Notified when the interpreter starts execution of a
318
+ # expression-statement.
319
+ def_plugin_and_notifier :expression_stmt_started, :expression_statement
320
+
321
+ # NOTE: Notified when the interpreter ends execution of a
322
+ # expression-statement.
323
+ def_plugin_and_notifier :expression_stmt_ended, :expression_statement
324
+
317
325
  # NOTE: Notified when the interpreter starts execution of a
318
326
  # switch-statement.
319
327
  def_plugin_and_notifier :switch_stmt_started, :switch_statement
@@ -1008,7 +1016,11 @@ module C #:nodoc:
1008
1016
  checkpoint(node.location)
1009
1017
 
1010
1018
  node.executed = true
1019
+ notify_expression_stmt_started(node)
1020
+
1011
1021
  interpret(node.expression) if node.expression
1022
+ ensure
1023
+ notify_expression_stmt_ended(node)
1012
1024
  end
1013
1025
 
1014
1026
  def visit_if_statement(node)
@@ -1278,7 +1290,11 @@ module C #:nodoc:
1278
1290
  # controlling variable is referred by the controlling
1279
1291
  # expression at the last iteration.
1280
1292
  # FIXME: This re-interpretation of the controlling expression may
1281
- # causes duplicative warning messages.
1293
+ # cause duplicative warning messages.
1294
+ # FIXME: This re-interpretation of the controlling expression always
1295
+ # causes "logical-expression must be false" warnings about a
1296
+ # one-time-for-loop. To avoid this, now, workarounds are in
1297
+ # builtin code checks W0609 and W0610.
1282
1298
  interpret(explicit_ctrlexpr)
1283
1299
  end
1284
1300
  end
@@ -222,6 +222,8 @@ module C #:nodoc:
222
222
  def_delegator :interpreter, :notify_prefix_decrement_expr_evaled
223
223
  def_delegator :interpreter, :notify_postfix_decrement_expr_evaled
224
224
  def_delegator :interpreter, :notify_assignment_expr_evaled
225
+ def_delegator :interpreter, :notify_expression_stmt_started
226
+ def_delegator :interpreter, :notify_expression_stmt_ended
225
227
  def_delegator :interpreter, :notify_switch_stmt_started
226
228
  def_delegator :interpreter, :notify_switch_stmt_ended
227
229
  def_delegator :interpreter, :notify_while_stmt_started
@@ -325,6 +325,28 @@ module C #:nodoc:
325
325
  end
326
326
  module_function :collect_additive_expressions
327
327
 
328
+ def collect_relational_expressions(node)
329
+ if node
330
+ RelationalExpressionCollector.new.tap { |collector|
331
+ node.accept(collector)
332
+ }.relational_expressions
333
+ else
334
+ []
335
+ end
336
+ end
337
+ module_function :collect_relational_expressions
338
+
339
+ def collect_equality_expressions(node)
340
+ if node
341
+ EqualityExpressionCollector.new.tap { |collector|
342
+ node.accept(collector)
343
+ }.equality_expressions
344
+ else
345
+ []
346
+ end
347
+ end
348
+ module_function :collect_equality_expressions
349
+
328
350
  def collect_logical_and_expressions(node)
329
351
  if node
330
352
  LogicalAndExpressionCollector.new.tap { |collector|
@@ -336,6 +358,17 @@ module C #:nodoc:
336
358
  end
337
359
  module_function :collect_logical_and_expressions
338
360
 
361
+ def collect_logical_or_expressions(node)
362
+ if node
363
+ LogicalOrExpressionCollector.new.tap { |collector|
364
+ node.accept(collector)
365
+ }.logical_or_expressions
366
+ else
367
+ []
368
+ end
369
+ end
370
+ module_function :collect_logical_or_expressions
371
+
339
372
  def collect_generic_labeled_statements(node)
340
373
  if node
341
374
  GenericLabeledStatementCollector.new.tap { |collector|
@@ -5611,6 +5644,32 @@ module C #:nodoc:
5611
5644
  end
5612
5645
  end
5613
5646
 
5647
+ class RelationalExpressionCollector < SyntaxTreeVisitor
5648
+ def initialize
5649
+ @relational_expressions = []
5650
+ end
5651
+
5652
+ attr_reader :relational_expressions
5653
+
5654
+ def visit_relational_expression(node)
5655
+ super
5656
+ @relational_expressions.push(node)
5657
+ end
5658
+ end
5659
+
5660
+ class EqualityExpressionCollector < SyntaxTreeVisitor
5661
+ def initialize
5662
+ @equality_expressions = []
5663
+ end
5664
+
5665
+ attr_reader :equality_expressions
5666
+
5667
+ def visit_equality_expression(node)
5668
+ super
5669
+ @equality_expressions.push(node)
5670
+ end
5671
+ end
5672
+
5614
5673
  class LogicalAndExpressionCollector < SyntaxTreeVisitor
5615
5674
  def initialize
5616
5675
  @logical_and_expressions = []
@@ -5624,6 +5683,19 @@ module C #:nodoc:
5624
5683
  end
5625
5684
  end
5626
5685
 
5686
+ class LogicalOrExpressionCollector < SyntaxTreeVisitor
5687
+ def initialize
5688
+ @logical_or_expressions = []
5689
+ end
5690
+
5691
+ attr_reader :logical_or_expressions
5692
+
5693
+ def visit_logical_or_expression(node)
5694
+ super
5695
+ @logical_or_expressions.push(node)
5696
+ end
5697
+ end
5698
+
5627
5699
  class GenericLabeledStatementCollector < SyntaxTreeVisitor
5628
5700
  def initialize
5629
5701
  @generic_labeled_statements = []