adlint 1.16.0 → 1.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/ChangeLog +471 -0
  2. data/MANIFEST +35 -8
  3. data/NEWS +50 -4
  4. data/bin/adlint +7 -7
  5. data/bin/adlint_chk +7 -7
  6. data/bin/adlint_cma +7 -7
  7. data/bin/adlint_sma +7 -7
  8. data/bin/adlintize +5 -5
  9. data/etc/mesg.d/en_US/messages.yml +3 -3
  10. data/etc/mesg.d/ja_JP/messages.yml +3 -3
  11. data/features/message_detection/E0013.feature +34 -0
  12. data/features/message_detection/W0007.feature +2 -0
  13. data/features/message_detection/W0583.feature +1 -2
  14. data/features/message_detection/W0641.feature +132 -0
  15. data/features/message_detection/W0643.feature +1 -1
  16. data/features/message_detection/W0644.feature +529 -0
  17. data/features/message_detection/W0645.feature +1 -1
  18. data/features/message_detection/W0649.feature +277 -0
  19. data/features/message_detection/W0650.feature +208 -0
  20. data/features/message_detection/W0697.feature +6 -0
  21. data/features/message_detection/W0705.feature +350 -0
  22. data/features/message_detection/W0707.feature +223 -0
  23. data/features/message_detection/W0711.feature +113 -0
  24. data/features/message_detection/W0712.feature +113 -0
  25. data/features/message_detection/W0713.feature +110 -0
  26. data/features/message_detection/W0714.feature +118 -0
  27. data/features/message_detection/W0715.feature +118 -0
  28. data/features/message_detection/W0716.feature +1 -0
  29. data/features/message_detection/W0717.feature +1 -0
  30. data/features/message_detection/W0718.feature +1 -0
  31. data/features/message_detection/W0719.feature +154 -0
  32. data/features/message_detection/W0723.feature +1 -2
  33. data/features/message_detection/W0732.feature +3 -0
  34. data/features/message_detection/W0733.feature +3 -0
  35. data/features/message_detection/W0734.feature +4 -0
  36. data/features/message_detection/W0735.feature +4 -0
  37. data/features/message_detection/W0745.feature +132 -0
  38. data/features/message_detection/W0780.feature +68 -0
  39. data/features/message_detection/W0783.feature +95 -0
  40. data/features/message_detection/W0792.feature +124 -0
  41. data/features/message_detection/W0793.feature +153 -0
  42. data/features/message_detection/W0794.feature +90 -0
  43. data/features/message_detection/W0830.feature +65 -0
  44. data/features/message_detection/W0833.feature +220 -0
  45. data/features/message_detection/W0834.feature +189 -0
  46. data/features/message_detection/W1026.feature +105 -0
  47. data/features/message_detection/W1031.feature +17 -34
  48. data/features/message_detection/W1039.feature +268 -0
  49. data/features/message_detection/W1047.feature +163 -0
  50. data/features/message_detection/W1066.feature +1 -0
  51. data/features/message_detection/W1067.feature +1 -0
  52. data/features/message_detection/W1068.feature +1 -0
  53. data/features/message_detection/W1069.feature +5 -0
  54. data/features/message_detection/W1070.feature +5 -0
  55. data/features/message_detection/W1071.feature +83 -0
  56. data/features/message_detection/W1073.feature +3 -2
  57. data/features/message_detection/W9003.feature +7 -12
  58. data/features/step_definitions/message_detection_steps.rb +4 -31
  59. data/features/support/env.rb +117 -2
  60. data/lib/adlint/c/branch.rb +0 -2
  61. data/lib/adlint/c/ctrlexpr.rb +33 -0
  62. data/lib/adlint/c/expr.rb +119 -31
  63. data/lib/adlint/c/interp.rb +44 -3
  64. data/lib/adlint/c/message.rb +1411 -29
  65. data/lib/adlint/c/object.rb +16 -2
  66. data/lib/adlint/c/option.rb +1 -0
  67. data/lib/adlint/c/parser.rb +101 -100
  68. data/lib/adlint/c/parser.y +3 -2
  69. data/lib/adlint/c/phase.rb +18 -0
  70. data/lib/adlint/c/resolver.rb +23 -0
  71. data/lib/adlint/c/syntax.rb +90 -4
  72. data/lib/adlint/c/type.rb +177 -110
  73. data/lib/adlint/cpp/macro.rb +4 -4
  74. data/lib/adlint/version.rb +2 -2
  75. data/share/demo/bad_include/test/"1/".h +0 -0
  76. data/share/doc/developers_guide_ja.html +3 -3
  77. data/share/doc/developers_guide_ja.texi +1 -1
  78. data/share/doc/users_guide_en.html +467 -506
  79. data/share/doc/users_guide_en.texi +95 -125
  80. data/share/doc/users_guide_ja.html +471 -518
  81. data/share/doc/users_guide_ja.texi +95 -133
  82. data/spec/spec_helper.rb +6 -0
  83. metadata +37 -10
@@ -33,6 +33,7 @@ Feature: W0697
33
33
  | W0117 | 1 | 12 |
34
34
  | W0697 | 1 | 12 |
35
35
  | W0104 | 1 | 21 |
36
+ | W1071 | 1 | 12 |
36
37
  | W0628 | 1 | 12 |
37
38
 
38
39
  Scenario: `return' statements are only in a `if-else-if' statements chain
@@ -53,6 +54,7 @@ Feature: W0697
53
54
  | W0117 | 1 | 12 |
54
55
  | W0697 | 1 | 12 |
55
56
  | W0104 | 1 | 21 |
57
+ | W1071 | 1 | 12 |
56
58
  | W1069 | 3 | 5 |
57
59
  | W0628 | 1 | 12 |
58
60
 
@@ -80,6 +82,7 @@ Feature: W0697
80
82
  | W0117 | 1 | 12 |
81
83
  | W0697 | 1 | 12 |
82
84
  | W0104 | 1 | 21 |
85
+ | W1071 | 1 | 12 |
83
86
  | W0628 | 1 | 12 |
84
87
 
85
88
  Scenario: a `return' statement in non-void function
@@ -112,6 +115,7 @@ Feature: W0697
112
115
  | mesg | line | column |
113
116
  | W0117 | 1 | 12 |
114
117
  | W0104 | 1 | 21 |
118
+ | W1071 | 1 | 12 |
115
119
  | W0628 | 1 | 12 |
116
120
 
117
121
  Scenario: no implicit termination in `if-else-if' statements chain
@@ -133,6 +137,7 @@ Feature: W0697
133
137
  | mesg | line | column |
134
138
  | W0117 | 1 | 12 |
135
139
  | W0104 | 1 | 21 |
140
+ | W1071 | 1 | 12 |
136
141
  | W0628 | 1 | 12 |
137
142
 
138
143
  Scenario: no implicit termination with `switch' statement
@@ -158,6 +163,7 @@ Feature: W0697
158
163
  | mesg | line | column |
159
164
  | W0117 | 1 | 12 |
160
165
  | W0104 | 1 | 21 |
166
+ | W1071 | 1 | 12 |
161
167
  | W0628 | 1 | 12 |
162
168
 
163
169
  Scenario: no implicit termination with `goto' statement
@@ -0,0 +1,350 @@
1
+ Feature: W0705
2
+
3
+ W0705 detects that an array subscript may cause out of bound access of the
4
+ array object.
5
+
6
+ Scenario: array-subscript-expression with non-constant subscript may cause
7
+ OOB access in an initializer
8
+ Given a target source named "W0705.c" with:
9
+ """
10
+ extern int a[5];
11
+
12
+ int foo(int i)
13
+ {
14
+ if (i >= 0 && i < 5) {
15
+ int j = a[i + 1]; /* W0705 */
16
+ return j;
17
+ }
18
+ return i;
19
+ }
20
+ """
21
+ When I successfully run `adlint W0705.c` on noarch
22
+ Then the output should exactly match with:
23
+ | mesg | line | column |
24
+ | W0118 | 1 | 12 |
25
+ | W0117 | 3 | 5 |
26
+ | W0705 | 6 | 21 |
27
+ | W0100 | 6 | 13 |
28
+ | W0104 | 3 | 13 |
29
+ | W1071 | 3 | 5 |
30
+ | W0490 | 5 | 9 |
31
+ | W0499 | 5 | 9 |
32
+ | W0502 | 5 | 9 |
33
+ | W0628 | 3 | 5 |
34
+
35
+ Scenario: array-subscript-expression with non-constant subscript may cause
36
+ OOB access in rhs operand of an assignment-expression
37
+ Given a target source named "W0705.c" with:
38
+ """
39
+ extern int a[5];
40
+
41
+ int foo(int i)
42
+ {
43
+ int j = 0;
44
+ if (i >= 0 && i < 4) {
45
+ j = a[i - 1]; /* W0705 */
46
+ }
47
+ return j;
48
+ }
49
+ """
50
+ When I successfully run `adlint W0705.c` on noarch
51
+ Then the output should exactly match with:
52
+ | mesg | line | column |
53
+ | W0118 | 1 | 12 |
54
+ | W0117 | 3 | 5 |
55
+ | W0705 | 7 | 17 |
56
+ | W0104 | 3 | 13 |
57
+ | W0490 | 6 | 9 |
58
+ | W0499 | 6 | 9 |
59
+ | W0502 | 6 | 9 |
60
+ | W0628 | 3 | 5 |
61
+
62
+ Scenario: array-subscript-expression with non-constant subscript may cause
63
+ OOB access in lhs operand of an assignment-expression
64
+ Given a target source named "W0705.c" with:
65
+ """
66
+ extern int a[5];
67
+
68
+ void foo(int i)
69
+ {
70
+ if (i >= 0 && i < 3) {
71
+ a[i + 3] = 0; /* W0705 */
72
+ }
73
+ }
74
+ """
75
+ When I successfully run `adlint W0705.c` on noarch
76
+ Then the output should exactly match with:
77
+ | mesg | line | column |
78
+ | W0118 | 1 | 12 |
79
+ | W0117 | 3 | 6 |
80
+ | W0705 | 6 | 13 |
81
+ | W0104 | 3 | 14 |
82
+ | W0490 | 5 | 9 |
83
+ | W0499 | 5 | 9 |
84
+ | W0502 | 5 | 9 |
85
+ | W0628 | 3 | 6 |
86
+
87
+ Scenario: indirection-expression with non-constant subscript may cause OOB
88
+ access in rhs operand of an assignment-expression
89
+ Given a target source named "W0705.c" with:
90
+ """
91
+ extern int a[5];
92
+
93
+ int foo(int i)
94
+ {
95
+ int j = 0;
96
+ if (i >= 0 && i < 5) {
97
+ j = *(a + i - 1); /* W0705 */
98
+ }
99
+ return j;
100
+ }
101
+ """
102
+ When I successfully run `adlint W0705.c` on noarch
103
+ Then the output should exactly match with:
104
+ | mesg | line | column |
105
+ | W0118 | 1 | 12 |
106
+ | W0117 | 3 | 5 |
107
+ | W9003 | 7 | 19 |
108
+ | W9003 | 7 | 23 |
109
+ | W0024 | 7 | 21 |
110
+ | W0705 | 7 | 14 |
111
+ | W0104 | 3 | 13 |
112
+ | W0490 | 6 | 9 |
113
+ | W0499 | 6 | 9 |
114
+ | W0502 | 6 | 9 |
115
+ | W0628 | 3 | 5 |
116
+
117
+ Scenario: indirection-expression with non-constant subscript may cause OOB
118
+ access in lhs operand of an assignment-expression
119
+ Given a target source named "W0705.c" with:
120
+ """
121
+ extern int a[5];
122
+
123
+ void foo(int i)
124
+ {
125
+ if (i >= 0 && i < 5) {
126
+ *(2 + a + i - 1) = 0; /* W0705 */
127
+ }
128
+ }
129
+ """
130
+ When I successfully run `adlint W0705.c` on noarch
131
+ Then the output should exactly match with:
132
+ | mesg | line | column |
133
+ | W0118 | 1 | 12 |
134
+ | W0117 | 3 | 6 |
135
+ | W9003 | 6 | 11 |
136
+ | W0023 | 6 | 13 |
137
+ | W9003 | 6 | 19 |
138
+ | W9003 | 6 | 23 |
139
+ | W0024 | 6 | 21 |
140
+ | W0705 | 6 | 10 |
141
+ | W0104 | 3 | 14 |
142
+ | W0490 | 5 | 9 |
143
+ | W0499 | 5 | 9 |
144
+ | W0502 | 5 | 9 |
145
+ | W0628 | 3 | 6 |
146
+
147
+ Scenario: array-subscript-expression with non-constant subscript must not
148
+ cuase OOB access in initializer
149
+ Given a target source named "W0705.c" with:
150
+ """
151
+ extern int a[5];
152
+
153
+ int foo(int i)
154
+ {
155
+ if (i > 0 && i <= 5) {
156
+ int j = a[i - 1]; /* OK */
157
+ return j;
158
+ }
159
+ return i;
160
+ }
161
+ """
162
+ When I successfully run `adlint W0705.c` on noarch
163
+ Then the output should exactly match with:
164
+ | mesg | line | column |
165
+ | W0118 | 1 | 12 |
166
+ | W0117 | 3 | 5 |
167
+ | W0100 | 6 | 13 |
168
+ | W0104 | 3 | 13 |
169
+ | W1071 | 3 | 5 |
170
+ | W0490 | 5 | 9 |
171
+ | W0499 | 5 | 9 |
172
+ | W0502 | 5 | 9 |
173
+ | W0628 | 3 | 5 |
174
+
175
+ Scenario: array-subscript-expression with non-constant subscript must not
176
+ cause OOB access in rhs operand of an assignment-expression
177
+ Given a target source named "W0705.c" with:
178
+ """
179
+ extern int a[5];
180
+
181
+ int foo(int i)
182
+ {
183
+ int j = 0;
184
+ if (i >= 0 && i < 4) {
185
+ j = a[i + 1]; /* OK */
186
+ }
187
+ return j;
188
+ }
189
+ """
190
+ When I successfully run `adlint W0705.c` on noarch
191
+ Then the output should exactly match with:
192
+ | mesg | line | column |
193
+ | W0118 | 1 | 12 |
194
+ | W0117 | 3 | 5 |
195
+ | W0104 | 3 | 13 |
196
+ | W0490 | 6 | 9 |
197
+ | W0499 | 6 | 9 |
198
+ | W0502 | 6 | 9 |
199
+ | W0628 | 3 | 5 |
200
+
201
+ Scenario: array-subscript-expression with non-constant subscript must not
202
+ cause OOB access in lhs operand of an assignment-expression
203
+ Given a target source named "W0705.c" with:
204
+ """
205
+ extern int a[5];
206
+
207
+ void foo(int i)
208
+ {
209
+ if (i >= 0 && i < 3) {
210
+ a[i + 2] = 0; /* OK */
211
+ }
212
+ }
213
+ """
214
+ When I successfully run `adlint W0705.c` on noarch
215
+ Then the output should exactly match with:
216
+ | mesg | line | column |
217
+ | W0118 | 1 | 12 |
218
+ | W0117 | 3 | 6 |
219
+ | W0104 | 3 | 14 |
220
+ | W0490 | 5 | 9 |
221
+ | W0499 | 5 | 9 |
222
+ | W0502 | 5 | 9 |
223
+ | W0628 | 3 | 6 |
224
+
225
+ Scenario: indirection-expression with non-constant subscript must not cause
226
+ OOB access in rhs operand of an assignment-expression
227
+ Given a target source named "W0705.c" with:
228
+ """
229
+ extern int a[5];
230
+
231
+ int foo(int i)
232
+ {
233
+ int j = 0;
234
+ if (i > 0 && i < 6) {
235
+ j = *(a + i - 1); /* OK */
236
+ }
237
+ return j;
238
+ }
239
+ """
240
+ When I successfully run `adlint W0705.c` on noarch
241
+ Then the output should exactly match with:
242
+ | mesg | line | column |
243
+ | W0118 | 1 | 12 |
244
+ | W0117 | 3 | 5 |
245
+ | W9003 | 7 | 19 |
246
+ | W9003 | 7 | 23 |
247
+ | W0024 | 7 | 21 |
248
+ | W0104 | 3 | 13 |
249
+ | W0490 | 6 | 9 |
250
+ | W0499 | 6 | 9 |
251
+ | W0502 | 6 | 9 |
252
+ | W0628 | 3 | 5 |
253
+
254
+ Scenario: indirection-expression with non-constant subscript must not cause
255
+ OOB access in lhs operand of an assignment-expression
256
+ Given a target source named "W0705.c" with:
257
+ """
258
+ extern int a[5];
259
+
260
+ void foo(int i)
261
+ {
262
+ if (i >= 0 && i < 5) {
263
+ *(2 + a + i - 2) = 0; /* OK */
264
+ }
265
+ }
266
+ """
267
+ When I successfully run `adlint W0705.c` on noarch
268
+ Then the output should exactly match with:
269
+ | mesg | line | column |
270
+ | W0118 | 1 | 12 |
271
+ | W0117 | 3 | 6 |
272
+ | W9003 | 6 | 11 |
273
+ | W0023 | 6 | 13 |
274
+ | W9003 | 6 | 19 |
275
+ | W9003 | 6 | 23 |
276
+ | W0023 | 6 | 21 |
277
+ | W0104 | 3 | 14 |
278
+ | W0490 | 5 | 9 |
279
+ | W0499 | 5 | 9 |
280
+ | W0502 | 5 | 9 |
281
+ | W0628 | 3 | 6 |
282
+
283
+ Scenario: indirection-expression with non-constant subscript should not cause
284
+ OOB access in an initializer
285
+ Given a target source named "W0705.c" with:
286
+ """
287
+ extern int a[5];
288
+
289
+ int foo(int i)
290
+ {
291
+ if (i >= 0 && i < 5) {
292
+ int j = *(a + i++); /* OK */
293
+ int k = *(a + i - 1); /* OK */
294
+ return j;
295
+ }
296
+ return i;
297
+ }
298
+ """
299
+ When I successfully run `adlint W0705.c` on noarch
300
+ Then the output should exactly match with:
301
+ | mesg | line | column |
302
+ | W0118 | 1 | 12 |
303
+ | W0117 | 3 | 5 |
304
+ | W9003 | 6 | 24 |
305
+ | W9003 | 7 | 23 |
306
+ | W9003 | 7 | 27 |
307
+ | W0024 | 7 | 25 |
308
+ | W0100 | 6 | 13 |
309
+ | W0100 | 7 | 13 |
310
+ | W1071 | 3 | 5 |
311
+ | W0490 | 5 | 9 |
312
+ | W0499 | 5 | 9 |
313
+ | W0502 | 5 | 9 |
314
+ | W0628 | 3 | 5 |
315
+
316
+ Scenario: indirection-expression with non-constant subscript may and should
317
+ not cause OOB access in an initializer
318
+ Given a target source named "W0705.c" with:
319
+ """
320
+ extern int a[5];
321
+
322
+ int foo(int i)
323
+ {
324
+ if (i >= 0 && i < 5) {
325
+ int j = *(a + ++i); /* W0705 */
326
+ int k = *(a + i - 1); /* OK */
327
+ return j;
328
+ }
329
+ return i;
330
+ }
331
+ """
332
+ When I successfully run `adlint W0705.c` on noarch
333
+ Then the output should exactly match with:
334
+ | mesg | line | column |
335
+ | W0118 | 1 | 12 |
336
+ | W0117 | 3 | 5 |
337
+ | W9003 | 6 | 23 |
338
+ | W0705 | 6 | 18 |
339
+ | W9003 | 7 | 23 |
340
+ | W9003 | 7 | 27 |
341
+ | W0024 | 7 | 25 |
342
+ | W0100 | 6 | 13 |
343
+ | W0100 | 7 | 13 |
344
+ | W1071 | 3 | 5 |
345
+ | W0490 | 5 | 9 |
346
+ | W0499 | 5 | 9 |
347
+ | W0502 | 5 | 9 |
348
+ | W0628 | 3 | 5 |
349
+
350
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,223 @@
1
+ Feature: W0707
2
+
3
+ W0707 detects that a constant-expression array subscript must cause out of
4
+ bound access of the array object.
5
+
6
+ Scenario: array-subscript-expression with constant subscript must cause OOB
7
+ access in an initializer
8
+ Given a target source named "W0707.c" with:
9
+ """
10
+ extern int a[5];
11
+
12
+ int foo(void)
13
+ {
14
+ int i = a[5]; /* W0707 */
15
+ return i;
16
+ }
17
+ """
18
+ When I successfully run `adlint W0707.c` on noarch
19
+ Then the output should exactly match with:
20
+ | mesg | line | column |
21
+ | W0118 | 1 | 12 |
22
+ | W0117 | 3 | 5 |
23
+ | W0707 | 5 | 15 |
24
+ | W0100 | 5 | 9 |
25
+ | W0628 | 3 | 5 |
26
+
27
+ Scenario: array-subscript-expression with constant subscript must cause OOB
28
+ access in rhs operand of an assignment-expression
29
+ Given a target source named "W0707.c" with:
30
+ """
31
+ extern int a[5];
32
+
33
+ int foo(void)
34
+ {
35
+ int i = 0;
36
+ i = a[-1]; /* W0707 */
37
+ return i;
38
+ }
39
+ """
40
+ When I successfully run `adlint W0707.c` on noarch
41
+ Then the output should exactly match with:
42
+ | mesg | line | column |
43
+ | W0118 | 1 | 12 |
44
+ | W0117 | 3 | 5 |
45
+ | W0707 | 6 | 11 |
46
+ | W0628 | 3 | 5 |
47
+
48
+ Scenario: array-subscript-expression with constant subscript must cause OOB
49
+ access in lhs operand of an assignment-expression
50
+ Given a target source named "W0707.c" with:
51
+ """
52
+ extern int a[5];
53
+
54
+ void foo(int i)
55
+ {
56
+ a[5] = i; /* W0707 */
57
+ }
58
+ """
59
+ When I successfully run `adlint W0707.c` on noarch
60
+ Then the output should exactly match with:
61
+ | mesg | line | column |
62
+ | W0118 | 1 | 12 |
63
+ | W0117 | 3 | 6 |
64
+ | W0707 | 5 | 7 |
65
+ | W0104 | 3 | 14 |
66
+ | W0628 | 3 | 6 |
67
+
68
+ Scenario: indirection-expression with constant subscript must cause OOB
69
+ access in rhs operand of an assignment-expression
70
+ Given a target source named "W0707.c" with:
71
+ """
72
+ extern int a[5];
73
+
74
+ int foo(void)
75
+ {
76
+ int i = 0;
77
+ i = *(a + 5 - 6); /* W0707 */
78
+ return i;
79
+ }
80
+ """
81
+ When I successfully run `adlint W0707.c` on noarch
82
+ Then the output should exactly match with:
83
+ | mesg | line | column |
84
+ | W0118 | 1 | 12 |
85
+ | W0117 | 3 | 5 |
86
+ | W9003 | 6 | 15 |
87
+ | W0023 | 6 | 13 |
88
+ | W9003 | 6 | 19 |
89
+ | W0023 | 6 | 17 |
90
+ | W0707 | 6 | 10 |
91
+ | W0628 | 3 | 5 |
92
+
93
+ Scenario: indirection-expression with constant subscript must cause OOB
94
+ access in lhs operand of an assignment-expression
95
+ Given a target source named "W0707.c" with:
96
+ """
97
+ extern int a[5];
98
+
99
+ void foo(int i)
100
+ {
101
+ *(a - 1 + 6) = i; /* W0707 */
102
+ }
103
+ """
104
+ When I successfully run `adlint W0707.c` on noarch
105
+ Then the output should exactly match with:
106
+ | mesg | line | column |
107
+ | W0118 | 1 | 12 |
108
+ | W0117 | 3 | 6 |
109
+ | W9003 | 5 | 11 |
110
+ | W0024 | 5 | 9 |
111
+ | W9003 | 5 | 15 |
112
+ | W0023 | 5 | 13 |
113
+ | W0707 | 5 | 6 |
114
+ | W0104 | 3 | 14 |
115
+ | W0628 | 3 | 6 |
116
+
117
+ Scenario: array-subscript-expression with constant subscript must not cause
118
+ OOB access in an initializer
119
+ Given a target source named "W0707.c" with:
120
+ """
121
+ extern int a[5];
122
+
123
+ int foo(void)
124
+ {
125
+ int i = a[3]; /* OK */
126
+ return i;
127
+ }
128
+ """
129
+ When I successfully run `adlint W0707.c` on noarch
130
+ Then the output should exactly match with:
131
+ | mesg | line | column |
132
+ | W0118 | 1 | 12 |
133
+ | W0117 | 3 | 5 |
134
+ | W0100 | 5 | 9 |
135
+ | W0628 | 3 | 5 |
136
+
137
+ Scenario: array-subscript-expression with constant subscript must not cause
138
+ OOB access in rhs operand of an assignment-expression
139
+ Given a target source named "W0707.c" with:
140
+ """
141
+ extern int a[5];
142
+
143
+ int foo(void)
144
+ {
145
+ int i = 0;
146
+ i = a[0]; /* OK */
147
+ return i;
148
+ }
149
+ """
150
+ When I successfully run `adlint W0707.c` on noarch
151
+ Then the output should exactly match with:
152
+ | mesg | line | column |
153
+ | W0118 | 1 | 12 |
154
+ | W0117 | 3 | 5 |
155
+ | W0628 | 3 | 5 |
156
+
157
+ Scenario: array-subscript-expression with constant subscript must not cause
158
+ OOB access in lhs operand of an assignment-expression
159
+ Given a target source named "W0707.c" with:
160
+ """
161
+ extern int a[5];
162
+
163
+ void foo(int i)
164
+ {
165
+ a[4] = i; /* OK */
166
+ }
167
+ """
168
+ When I successfully run `adlint W0707.c` on noarch
169
+ Then the output should exactly match with:
170
+ | mesg | line | column |
171
+ | W0118 | 1 | 12 |
172
+ | W0117 | 3 | 6 |
173
+ | W0104 | 3 | 14 |
174
+ | W0628 | 3 | 6 |
175
+
176
+ Scenario: indirection-expression with constant subscript must not cause OOB
177
+ access in rhs operand of an assignment-expression
178
+ Given a target source named "W0707.c" with:
179
+ """
180
+ extern int a[5];
181
+
182
+ int foo(void)
183
+ {
184
+ int i = 0;
185
+ i = *(a - 2 + 3); /* OK */
186
+ return i;
187
+ }
188
+ """
189
+ When I successfully run `adlint W0707.c` on noarch
190
+ Then the output should exactly match with:
191
+ | mesg | line | column |
192
+ | W0118 | 1 | 12 |
193
+ | W0117 | 3 | 5 |
194
+ | W9003 | 6 | 15 |
195
+ | W0023 | 6 | 13 |
196
+ | W9003 | 6 | 19 |
197
+ | W0023 | 6 | 17 |
198
+ | W0628 | 3 | 5 |
199
+
200
+ Scenario: indirection-expression with constant subscript must not cause OOB
201
+ access in lhs operand of an assignment-expression
202
+ Given a target source named "W0707.c" with:
203
+ """
204
+ extern int a[5];
205
+
206
+ void foo(int i)
207
+ {
208
+ *(a + 4 - 1) = i; /* OK */
209
+ }
210
+ """
211
+ When I successfully run `adlint W0707.c` on noarch
212
+ Then the output should exactly match with:
213
+ | mesg | line | column |
214
+ | W0118 | 1 | 12 |
215
+ | W0117 | 3 | 6 |
216
+ | W9003 | 5 | 11 |
217
+ | W0023 | 5 | 9 |
218
+ | W9003 | 5 | 15 |
219
+ | W0024 | 5 | 13 |
220
+ | W0104 | 3 | 14 |
221
+ | W0628 | 3 | 6 |
222
+
223
+ # vim:ts=2:sw=2:sts=2:et: