adlint 3.0.8 → 3.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/ChangeLog +295 -0
  2. data/MANIFEST +9 -0
  3. data/NEWS +25 -4
  4. data/etc/mesg.d/c_builtin/en_US/messages.yml +1 -1
  5. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +1 -1
  6. data/etc/mesg.d/core/en_US/messages.yml +1 -1
  7. data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
  8. data/features/code_check/E0008.feature +20 -0
  9. data/features/code_check/W0093.feature +1 -1
  10. data/features/code_check/W0097.feature +30 -0
  11. data/features/code_check/W0100.feature +66 -0
  12. data/features/code_check/W0422.feature +157 -0
  13. data/features/code_check/W0459.feature +118 -0
  14. data/features/code_check/W0461.feature +115 -0
  15. data/features/code_check/W0610.feature +59 -0
  16. data/features/code_check/W0612.feature +29 -0
  17. data/features/code_check/W0613.feature +33 -0
  18. data/features/code_check/W0704.feature +25 -0
  19. data/features/code_check/W0705.feature +33 -0
  20. data/features/code_check/W1050.feature +43 -0
  21. data/features/code_check/W1071.feature +30 -0
  22. data/features/code_check/W9001.feature +24 -0
  23. data/lib/adlint/cc1/branch.rb +32 -9
  24. data/lib/adlint/cc1/builtin.rb +2 -2
  25. data/lib/adlint/cc1/conv.rb +33 -33
  26. data/lib/adlint/cc1/ctrlexpr.rb +30 -30
  27. data/lib/adlint/cc1/domain.rb +12 -4
  28. data/lib/adlint/cc1/environ.rb +2 -1
  29. data/lib/adlint/cc1/expr.rb +135 -125
  30. data/lib/adlint/cc1/format.rb +3 -3
  31. data/lib/adlint/cc1/interp.rb +123 -109
  32. data/lib/adlint/cc1/lexer.rb +44 -40
  33. data/lib/adlint/cc1/mediator.rb +2 -2
  34. data/lib/adlint/cc1/object.rb +121 -36
  35. data/lib/adlint/cc1/option.rb +1 -0
  36. data/lib/adlint/cc1/parser.rb +874 -845
  37. data/lib/adlint/cc1/parser.y +22 -2
  38. data/lib/adlint/cc1/syntax.rb +37 -18
  39. data/lib/adlint/cc1/type.rb +3 -3
  40. data/lib/adlint/cc1/value.rb +58 -50
  41. data/lib/adlint/cpp/lexer.rb +5 -1
  42. data/lib/adlint/cpp/macro.rb +30 -30
  43. data/lib/adlint/cpp/subst.rb +4 -4
  44. data/lib/adlint/exam/c_builtin/cc1_check.rb +172 -172
  45. data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +11 -11
  46. data/lib/adlint/exam/c_builtin/cpp_check.rb +2 -2
  47. data/lib/adlint/memo.rb +13 -13
  48. data/lib/adlint/prelude.rb +2 -2
  49. data/lib/adlint/version.rb +2 -2
  50. data/share/doc/developers_guide_ja.html +7 -5
  51. data/share/doc/developers_guide_ja.texi +5 -3
  52. data/share/doc/users_guide_en.html +3 -3
  53. data/share/doc/users_guide_en.texi +1 -1
  54. data/share/doc/users_guide_ja.html +3 -3
  55. data/share/doc/users_guide_ja.texi +1 -1
  56. metadata +11 -2
@@ -1,6 +1,6 @@
1
1
  Feature: W0093
2
2
 
3
- W0093 detects that a division-by-zero may occur.
3
+ W0093 detects that a multiplicative-expression may cause division-by-zero.
4
4
 
5
5
  Scenario: narrowing denominator variable by an iteration controlling
6
6
  variable which has same value domain of the denominator
@@ -0,0 +1,30 @@
1
+ Feature: W0097
2
+
3
+ W0097 detects that a multiplicative-expression must cause division-by-zero.
4
+
5
+ Scenario: dividing by global constant variable initialized with 0
6
+ Given a target source named "fixture.c" with:
7
+ """
8
+ static const int i = 0;
9
+
10
+ static int foo(void)
11
+ {
12
+ return 3 / i; /* W0097 */
13
+ }
14
+
15
+ static int bar(void)
16
+ {
17
+ return 3 / i; /* W0097 */
18
+ }
19
+ """
20
+ When I successfully run `adlint fixture.c` on noarch
21
+ Then the output should exactly match with:
22
+ | mesg | line | column |
23
+ | W1076 | 3 | 12 |
24
+ | W0097 | 5 | 14 |
25
+ | W1076 | 8 | 12 |
26
+ | W0097 | 10 | 14 |
27
+ | W0629 | 3 | 12 |
28
+ | W0629 | 8 | 12 |
29
+ | W0628 | 3 | 12 |
30
+ | W0628 | 8 | 12 |
@@ -0,0 +1,66 @@
1
+ Feature: W0100
2
+
3
+ W0100 detects that a variable is not reassigned since the initial value is
4
+ assigned.
5
+
6
+ Scenario: reassigning value to an array element of the indefinite subscript
7
+ Given a target source named "fixture.c" with:
8
+ """
9
+ void foo(int i)
10
+ {
11
+ int a[3]; /* OK not W0100 */
12
+ a[i] = 0;
13
+ }
14
+ """
15
+ When I successfully run `adlint fixture.c` on noarch
16
+ Then the output should exactly match with:
17
+ | mesg | line | column |
18
+ | W0117 | 1 | 6 |
19
+ | W0705 | 4 | 7 |
20
+ | W0104 | 1 | 14 |
21
+ | W0950 | 3 | 11 |
22
+ | W0628 | 1 | 6 |
23
+
24
+ Scenario: reassigning value to a nested array element of the indefinite
25
+ subscript
26
+ Given a target source named "fixture.c" with:
27
+ """
28
+ void foo(int i)
29
+ {
30
+ int a[3][3]; /* OK not W0100 */
31
+ a[i][i] = 0;
32
+ }
33
+ """
34
+ When I successfully run `adlint fixture.c` on noarch
35
+ Then the output should exactly match with:
36
+ | mesg | line | column |
37
+ | W0117 | 1 | 6 |
38
+ | W0705 | 4 | 7 |
39
+ | W0705 | 4 | 10 |
40
+ | W0104 | 1 | 14 |
41
+ | W0950 | 3 | 14 |
42
+ | W0950 | 3 | 11 |
43
+ | W0628 | 1 | 6 |
44
+
45
+ Scenario: only reference to a nested array element of the indefinite
46
+ subscript
47
+ Given a target source named "fixture.c" with:
48
+ """
49
+ void foo(int i)
50
+ {
51
+ int a[3][3]; /* W0100 */
52
+ a[i][i];
53
+ }
54
+ """
55
+ When I successfully run `adlint fixture.c` on noarch
56
+ Then the output should exactly match with:
57
+ | mesg | line | column |
58
+ | W0117 | 1 | 6 |
59
+ | W0705 | 4 | 7 |
60
+ | W0705 | 4 | 10 |
61
+ | W0100 | 3 | 9 |
62
+ | W0104 | 1 | 14 |
63
+ | W0950 | 3 | 14 |
64
+ | W0950 | 3 | 11 |
65
+ | W0085 | 4 | 5 |
66
+ | W0628 | 1 | 6 |
@@ -126,3 +126,160 @@ Feature: W0422
126
126
  | W1071 | 3 | 6 |
127
127
  | W0948 | 5 | 21 |
128
128
  | W0628 | 3 | 6 |
129
+
130
+ Scenario: value of the global pointer is correctly null-checked by the
131
+ controlling-expression of while-statement
132
+ Given a target source named "fixture.c" with:
133
+ """
134
+ int *ptr = NULL;
135
+
136
+ static void foo(void)
137
+ {
138
+ while (ptr) {
139
+ int i, *p = ptr;
140
+ i = *p; /* OK */
141
+ }
142
+ }
143
+ """
144
+ When I successfully run `adlint fixture.c` on noarch
145
+ Then the output should exactly match with:
146
+ | mesg | line | column |
147
+ | W0117 | 1 | 6 |
148
+ | W1076 | 3 | 13 |
149
+ | W0100 | 6 | 17 |
150
+ | W0629 | 3 | 13 |
151
+ | W0114 | 5 | 5 |
152
+ | W0425 | 6 | 17 |
153
+ | W0628 | 3 | 13 |
154
+ | W0589 | 1 | 6 |
155
+ | W0593 | 1 | 6 |
156
+
157
+ Scenario: global pointer array as the controlling-expression of if-statement
158
+ Given a target source named "fixture.c" with:
159
+ """
160
+ int *a[3] = { 0 };
161
+
162
+ int foo(void)
163
+ {
164
+ if (a[2] == NULL) {
165
+ return *a[2];
166
+ }
167
+ else if (a[2] == 1) {
168
+ return *a[2];
169
+ }
170
+ return *a[2]; /* OK not W0422 */
171
+ }
172
+ """
173
+ When I successfully run `adlint fixture.c` on noarch
174
+ Then the output should exactly match with:
175
+ | mesg | line | column |
176
+ | W0117 | 1 | 6 |
177
+ | W0117 | 3 | 5 |
178
+ | W0421 | 6 | 16 |
179
+ | W9003 | 8 | 22 |
180
+ | W0027 | 8 | 19 |
181
+ | W1071 | 3 | 5 |
182
+ | W0950 | 1 | 8 |
183
+ | W1069 | 5 | 5 |
184
+ | W0628 | 3 | 5 |
185
+ | W0589 | 1 | 6 |
186
+ | W0593 | 1 | 6 |
187
+
188
+ Scenario: global pointer as the controlling-expression of if-statement
189
+ Given a target source named "fixture.c" with:
190
+ """
191
+ int *ptr = 0;
192
+
193
+ int bar(void)
194
+ {
195
+ if (ptr == NULL) {
196
+ return *ptr;
197
+ }
198
+ else if (ptr == 1) {
199
+ return *ptr;
200
+ }
201
+ return *ptr; /* OK not W0422 */
202
+ }
203
+ """
204
+ When I successfully run `adlint fixture.c` on noarch
205
+ Then the output should exactly match with:
206
+ | mesg | line | column |
207
+ | W0117 | 1 | 6 |
208
+ | W0117 | 3 | 5 |
209
+ | W0421 | 6 | 16 |
210
+ | W9003 | 8 | 21 |
211
+ | W0027 | 8 | 18 |
212
+ | W1071 | 3 | 5 |
213
+ | W1069 | 5 | 5 |
214
+ | W0628 | 3 | 5 |
215
+ | W0589 | 1 | 6 |
216
+ | W0593 | 1 | 6 |
217
+
218
+ Scenario: global pointer as the controlling-expression of if-statement in an
219
+ iteration-statement
220
+ Given a target source named "fixture.c" with:
221
+ """
222
+ int *a[3] = { 0 };
223
+
224
+ int foo(unsigned int ui)
225
+ {
226
+ for (; ui < 3; ui++) {
227
+ if (a[ui] == NULL) {
228
+ break;
229
+ }
230
+ return *a[ui]; /* OK not W0422 */
231
+ }
232
+ return 0;
233
+ }
234
+ """
235
+ When I successfully run `adlint fixture.c` on noarch
236
+ Then the output should exactly match with:
237
+ | mesg | line | column |
238
+ | W0117 | 1 | 6 |
239
+ | W0117 | 3 | 5 |
240
+ | W0534 | 5 | 10 |
241
+ | W0167 | 5 | 17 |
242
+ | W0147 | 6 | 15 |
243
+ | W0147 | 9 | 19 |
244
+ | W0104 | 3 | 22 |
245
+ | W1071 | 3 | 5 |
246
+ | W0950 | 1 | 8 |
247
+ | W0628 | 3 | 5 |
248
+ | W0589 | 1 | 6 |
249
+ | W0593 | 1 | 6 |
250
+
251
+ Scenario: global pointer as the controlling-expression of if-statement in an
252
+ iteration-statement
253
+ Given a target source named "fixture.c" with:
254
+ """
255
+ int *ptr = 0;
256
+
257
+ int bar(unsigned int ui)
258
+ {
259
+ for (; ui < 3; ui++) {
260
+ if (ptr == NULL) {
261
+ break;
262
+ }
263
+ else if (ptr == 1) {
264
+ return *ptr; /* OK */
265
+ }
266
+ return *ptr; /* OK not W0422 */
267
+ }
268
+ }
269
+ """
270
+ When I successfully run `adlint fixture.c` on noarch
271
+ Then the output should exactly match with:
272
+ | mesg | line | column |
273
+ | W0117 | 1 | 6 |
274
+ | W0117 | 3 | 5 |
275
+ | W0534 | 5 | 10 |
276
+ | W0167 | 5 | 17 |
277
+ | W9003 | 9 | 25 |
278
+ | W0027 | 9 | 22 |
279
+ | W0697 | 3 | 5 |
280
+ | W0104 | 3 | 22 |
281
+ | W1071 | 3 | 5 |
282
+ | W1069 | 6 | 9 |
283
+ | W0628 | 3 | 5 |
284
+ | W0589 | 1 | 6 |
285
+ | W0593 | 1 | 6 |
@@ -0,0 +1,118 @@
1
+ Feature: W0459
2
+
3
+ W0459 detects that the variable is not initialized at point of the expression
4
+ evaluation.
5
+
6
+ Scenario: variable initialization by a function via the output parameter
7
+ Given a target source named "fixture.c" with:
8
+ """
9
+ extern void foo(int ***);
10
+ extern void bar(int **);
11
+
12
+ void baz(int i)
13
+ {
14
+ int **p;
15
+ foo(i == 0 ? NULL : &p);
16
+ bar(p);
17
+ }
18
+ """
19
+ When I successfully run `adlint fixture.c` on noarch
20
+ Then the output should exactly match with:
21
+ | mesg | line | column |
22
+ | W0118 | 1 | 13 |
23
+ | W0118 | 2 | 13 |
24
+ | W0117 | 4 | 6 |
25
+ | W0459 | 7 | 25 |
26
+ | W0100 | 6 | 11 |
27
+ | W0104 | 4 | 14 |
28
+ | W0501 | 7 | 16 |
29
+ | W0628 | 4 | 6 |
30
+
31
+ Scenario: reference to the uninitialized nested array element of the
32
+ indefinite subscript
33
+ Given a target source named "fixture.c" with:
34
+ """
35
+ int foo(int i)
36
+ {
37
+ int a[3][3]; /* W0100 */
38
+ return a[i][i]; /* W0459 */
39
+ }
40
+ """
41
+ When I successfully run `adlint fixture.c` on noarch
42
+ Then the output should exactly match with:
43
+ | mesg | line | column |
44
+ | W0117 | 1 | 5 |
45
+ | W0705 | 4 | 14 |
46
+ | W0705 | 4 | 17 |
47
+ | W0459 | 4 | 16 |
48
+ | W0100 | 3 | 9 |
49
+ | W0104 | 1 | 13 |
50
+ | W0950 | 3 | 14 |
51
+ | W0950 | 3 | 11 |
52
+ | W0628 | 1 | 5 |
53
+
54
+ Scenario: reference to the initialized array element of the indefinite
55
+ subscript
56
+ Given a target source named "fixture.c" with:
57
+ """
58
+ int foo(int i)
59
+ {
60
+ int a[3] = { 0 };
61
+
62
+ if (i < 3) {
63
+ return a[i]; /* OK not W0459 */
64
+ }
65
+ return 0;
66
+ }
67
+ """
68
+ When I successfully run `adlint fixture.c` on noarch
69
+ Then the output should exactly match with:
70
+ | mesg | line | column |
71
+ | W0117 | 1 | 5 |
72
+ | W0705 | 6 | 18 |
73
+ | W0100 | 3 | 9 |
74
+ | W0104 | 1 | 13 |
75
+ | W1071 | 1 | 5 |
76
+ | W0950 | 3 | 11 |
77
+ | W0628 | 1 | 5 |
78
+
79
+ Scenario: assign value to the variable in a switch-statement in an
80
+ iteration-statement
81
+ Given a target source named "fixture.c" with:
82
+ """
83
+ extern void bar(int *);
84
+
85
+ int foo(int a[])
86
+ {
87
+ int i;
88
+ int j;
89
+
90
+ for (i = 0; a[i]; i++) {
91
+ switch (a[i]) {
92
+ case 0:
93
+ bar(&j);
94
+ break;
95
+ case 2:
96
+ bar(&j);
97
+ break;
98
+ default:
99
+ break;
100
+ }
101
+ }
102
+
103
+ return j; /* OK but W0460 */
104
+ }
105
+ """
106
+ When I successfully run `adlint fixture.c` on noarch
107
+ Then the output should exactly match with:
108
+ | mesg | line | column |
109
+ | W0118 | 1 | 13 |
110
+ | W0117 | 3 | 5 |
111
+ | W0459 | 14 | 17 |
112
+ | W0460 | 21 | 12 |
113
+ | W0104 | 3 | 13 |
114
+ | W9001 | 10 | 9 |
115
+ | W9001 | 11 | 13 |
116
+ | W9001 | 12 | 13 |
117
+ | W0114 | 8 | 5 |
118
+ | W0628 | 3 | 5 |
@@ -0,0 +1,115 @@
1
+ Feature: W0461
2
+
3
+ W0461 detects that a pointer to the undefined value is passed as an argument.
4
+
5
+ Scenario: pointer to the global constant array initialized with a
6
+ string-literal
7
+ Given a target source named "fixture.c" with:
8
+ """
9
+ static const char str[] = "str";
10
+
11
+ extern void foo(const void *);
12
+
13
+ static void bar(void)
14
+ {
15
+ foo(str); /* OK */
16
+ }
17
+
18
+ static void baz(void)
19
+ {
20
+ foo(str); /* OK */
21
+ }
22
+ """
23
+ When I successfully run `adlint fixture.c` on noarch
24
+ Then the output should exactly match with:
25
+ | mesg | line | column |
26
+ | W0118 | 3 | 13 |
27
+ | W1076 | 5 | 13 |
28
+ | W1076 | 10 | 13 |
29
+ | W0629 | 5 | 13 |
30
+ | W0629 | 10 | 13 |
31
+ | W0947 | 1 | 27 |
32
+ | W0628 | 5 | 13 |
33
+ | W0628 | 10 | 13 |
34
+
35
+ Scenario: pointer to the global constant explicitly sized array initialized
36
+ with a string-literal
37
+ Given a target source named "fixture.c" with:
38
+ """
39
+ static const char str[4] = "str";
40
+
41
+ extern void foo(const void *);
42
+
43
+ static void bar(void)
44
+ {
45
+ foo(str); /* OK */
46
+ }
47
+
48
+ static void baz(void)
49
+ {
50
+ foo(str); /* OK */
51
+ }
52
+ """
53
+ When I successfully run `adlint fixture.c` on noarch
54
+ Then the output should exactly match with:
55
+ | mesg | line | column |
56
+ | W0118 | 3 | 13 |
57
+ | W1076 | 5 | 13 |
58
+ | W1076 | 10 | 13 |
59
+ | W0629 | 5 | 13 |
60
+ | W0629 | 10 | 13 |
61
+ | W0947 | 1 | 28 |
62
+ | W0950 | 1 | 23 |
63
+ | W0628 | 5 | 13 |
64
+ | W0628 | 10 | 13 |
65
+
66
+ Scenario: array elements may be initialized according to a parameter value
67
+ Given a target source named "fixture.c" with:
68
+ """
69
+ extern void bar(const int *);
70
+
71
+ void baz(int i)
72
+ {
73
+ int a[5];
74
+
75
+ for (; i < 2; i++) {
76
+ a[i] = i;
77
+ }
78
+
79
+ bar(a); /* OK not W0461 but W0462 */
80
+ }
81
+ """
82
+ When I successfully run `adlint fixture.c` on noarch
83
+ Then the output should exactly match with:
84
+ | mesg | line | column |
85
+ | W0118 | 1 | 13 |
86
+ | W0117 | 3 | 6 |
87
+ | W0534 | 7 | 10 |
88
+ | W0705 | 8 | 11 |
89
+ | W0462 | 11 | 9 |
90
+ | W0950 | 5 | 11 |
91
+ | W0628 | 3 | 6 |
92
+
93
+ Scenario: array elements is initialized by an iteration-statement
94
+ Given a target source named "fixture.c" with:
95
+ """
96
+ extern void bar(const int *);
97
+
98
+ void baz(void)
99
+ {
100
+ int a[3];
101
+
102
+ for (int i = 0; i < 3; i++) {
103
+ a[i] = i;
104
+ }
105
+
106
+ bar(a); /* OK */
107
+ }
108
+ """
109
+ When I successfully run `adlint fixture.c` on noarch
110
+ Then the output should exactly match with:
111
+ | mesg | line | column |
112
+ | W0118 | 1 | 13 |
113
+ | W0117 | 3 | 6 |
114
+ | W0950 | 5 | 11 |
115
+ | W0628 | 3 | 6 |