adlint 2.2.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/AUTHORS +0 -1
  2. data/ChangeLog +185 -1
  3. data/MANIFEST +3 -0
  4. data/NEWS +28 -5
  5. data/bin/adlintize +70 -7
  6. data/etc/conf.d/fallback/traits.erb +12 -3
  7. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +12 -3
  8. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +12 -3
  9. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +12 -3
  10. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +12 -3
  11. data/etc/conf.d/x86_64-ubuntu_12.04/traits-gcc_4.6.3.erb +12 -4
  12. data/etc/mesg.d/c_builtin/en_US/messages.yml +1 -1
  13. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +1 -1
  14. data/etc/mesg.d/core/en_US/messages.yml +1 -1
  15. data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
  16. data/features/code_check/W0070.feature +51 -0
  17. data/features/code_check/W0071.feature +51 -0
  18. data/features/code_check/W0425.feature +279 -0
  19. data/features/code_check/W0692.feature +14 -1
  20. data/features/code_check/W0834.feature +7 -5
  21. data/features/code_check/W1073.feature +0 -1
  22. data/features/code_check/W1074.feature +6 -0
  23. data/features/code_check/W9003.feature +54 -0
  24. data/features/support/env.rb +15 -3
  25. data/lib/adlint/c/expr.rb +30 -6
  26. data/lib/adlint/c/interp.rb +4 -0
  27. data/lib/adlint/cpp/eval.rb +24 -14
  28. data/lib/adlint/cpp/macro.rb +52 -40
  29. data/lib/adlint/exam/c_builtin/c_check.rb +76 -42
  30. data/lib/adlint/exam/c_builtin/cpp_check.rb +4 -2
  31. data/lib/adlint/traits.rb +37 -23
  32. data/lib/adlint/util.rb +6 -0
  33. data/lib/adlint/version.rb +3 -3
  34. data/share/doc/developers_guide_ja.html +3 -3
  35. data/share/doc/developers_guide_ja.texi +1 -1
  36. data/share/doc/users_guide_en.html +1679 -1651
  37. data/share/doc/users_guide_en.texi +56 -24
  38. data/share/doc/users_guide_ja.html +1697 -1669
  39. data/share/doc/users_guide_ja.texi +57 -24
  40. data/share/sample/bison-2.5/adlint/adlint_traits.yml +13 -4
  41. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +13 -4
  42. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +13 -4
  43. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +13 -4
  44. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +13 -4
  45. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +13 -4
  46. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +13 -4
  47. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +13 -4
  48. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +13 -4
  49. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +13 -4
  50. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +13 -4
  51. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +13 -4
  52. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +13 -4
  53. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +13 -4
  54. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +13 -4
  55. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +13 -4
  56. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +13 -4
  57. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +13 -4
  58. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +13 -4
  59. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +13 -4
  60. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +13 -4
  61. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +13 -4
  62. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +13 -4
  63. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +13 -4
  64. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +13 -4
  65. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +13 -4
  66. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +13 -4
  67. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +13 -4
  68. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +13 -4
  69. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +13 -4
  70. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +13 -4
  71. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +13 -4
  72. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +13 -4
  73. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +13 -4
  74. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +13 -4
  75. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +13 -4
  76. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +13 -4
  77. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +13 -4
  78. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +13 -4
  79. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +13 -4
  80. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +13 -4
  81. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +13 -4
  82. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +13 -4
  83. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +13 -4
  84. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +13 -4
  85. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +13 -4
  86. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +13 -4
  87. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +13 -4
  88. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +13 -4
  89. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +13 -4
  90. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +13 -4
  91. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +13 -4
  92. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +13 -4
  93. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +13 -4
  94. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +13 -4
  95. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +13 -4
  96. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +13 -4
  97. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +13 -4
  98. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +13 -4
  99. data/spec/conf.d/default_traits.yml +12 -4
  100. metadata +5 -2
@@ -0,0 +1,51 @@
1
+ Feature: W0071
2
+
3
+ W0071 detects that contents of a header included by #include "..." directive
4
+ are not referred by other files in a translation-unit.
5
+
6
+ Scenario: a typedef in the header and no reference to it
7
+ Given a target source named "fixture.c" with:
8
+ """
9
+ #include "test.h" /* W0071 */
10
+
11
+ int bar(void) { return 0; }
12
+ """
13
+ And a target source named "test.h" with:
14
+ """
15
+ #if !defined(TEST_H)
16
+ #define TEST_H
17
+
18
+ typedef int foo;
19
+
20
+ #endif
21
+ """
22
+ When I successfully run `adlint fixture.c` on noarch
23
+ Then the output should exactly match with:
24
+ | mesg | line | column |
25
+ | W0117 | 3 | 5 |
26
+ | W0071 | 1 | 1 |
27
+ | W0628 | 3 | 5 |
28
+
29
+ Scenario: a typedef in the header and reference to it in other file.
30
+ Given a target source named "fixture.c" with:
31
+ """
32
+ #include "test.h" /* OK */
33
+
34
+ foo bar(void) { return 0; }
35
+ """
36
+ And a target source named "test.h" with:
37
+ """
38
+ #if !defined(TEST_H)
39
+ #define TEST_H
40
+
41
+ typedef int foo;
42
+
43
+ #endif
44
+ """
45
+ When I successfully run `adlint fixture.c` on noarch
46
+ Then the output should exactly match with:
47
+ | mesg | line | column |
48
+ | W0117 | 3 | 5 |
49
+ | W0628 | 3 | 5 |
50
+
51
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,279 @@
1
+ Feature: W0425
2
+
3
+ W0425 detects that two or more declarations or statements are in a line.
4
+
5
+ Scenario: two declarations in a line
6
+ Given a target source named "fixture.c" with:
7
+ """
8
+ int foo(void)
9
+ {
10
+ int i = 0; int j = 0; /* W0425 */
11
+ return i + j;
12
+ }
13
+ """
14
+ When I successfully run `adlint fixture.c` on noarch
15
+ Then the output should exactly match with:
16
+ | mesg | line | column |
17
+ | W0117 | 1 | 5 |
18
+ | W0100 | 3 | 9 |
19
+ | W0100 | 3 | 20 |
20
+ | W0425 | 3 | 20 |
21
+ | W0628 | 1 | 5 |
22
+
23
+ Scenario: two declarators in a declaration
24
+ Given a target source named "fixture.c" with:
25
+ """
26
+ int foo(void)
27
+ {
28
+ int i = 0, j = 0; /* W0425 */
29
+ return i + j;
30
+ }
31
+ """
32
+ When I successfully run `adlint fixture.c` on noarch
33
+ Then the output should exactly match with:
34
+ | mesg | line | column |
35
+ | W0117 | 1 | 5 |
36
+ | W0100 | 3 | 9 |
37
+ | W0100 | 3 | 16 |
38
+ | W0425 | 3 | 16 |
39
+ | W0628 | 1 | 5 |
40
+
41
+ Scenario: a declaration and a jump-statement in a line
42
+ Given a target source named "fixture.c" with:
43
+ """
44
+ int foo(void)
45
+ {
46
+ int i = 0; return i + 1; /* W0425 */
47
+ }
48
+ """
49
+ When I successfully run `adlint fixture.c` on noarch
50
+ Then the output should exactly match with:
51
+ | mesg | line | column |
52
+ | W0117 | 1 | 5 |
53
+ | W0100 | 3 | 9 |
54
+ | W0425 | 3 | 16 |
55
+ | W0628 | 1 | 5 |
56
+
57
+ Scenario: a expression-statement and a jump-statement in a line
58
+ Given a target source named "fixture.c" with:
59
+ """
60
+ int foo(void)
61
+ {
62
+ int i;
63
+ i = 0; return i + 1; /* W0425 */
64
+ }
65
+ """
66
+ When I successfully run `adlint fixture.c` on noarch
67
+ Then the output should exactly match with:
68
+ | mesg | line | column |
69
+ | W0117 | 1 | 5 |
70
+ | W0100 | 3 | 9 |
71
+ | W0425 | 4 | 12 |
72
+ | W0628 | 1 | 5 |
73
+
74
+ Scenario: a if-else-statement in a line
75
+ Given a target source named "fixture.c" with:
76
+ """
77
+ int foo(int i)
78
+ {
79
+ if (i == 0) return 0; else return 1; /* OK */
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
+ | W0117 | 1 | 5 |
86
+ | W0104 | 1 | 13 |
87
+ | W1071 | 1 | 5 |
88
+ | W0414 | 3 | 17 |
89
+ | W0414 | 3 | 32 |
90
+ | W0628 | 1 | 5 |
91
+
92
+ Scenario: a if-else-statement with compound-statements in a line
93
+ Given a target source named "fixture.c" with:
94
+ """
95
+ int foo(int i)
96
+ {
97
+ if (i == 0) { return 0; } else { return 1; } /* OK */
98
+ }
99
+ """
100
+ When I successfully run `adlint fixture.c` on noarch
101
+ Then the output should exactly match with:
102
+ | mesg | line | column |
103
+ | W0117 | 1 | 5 |
104
+ | W0104 | 1 | 13 |
105
+ | W1071 | 1 | 5 |
106
+ | W0628 | 1 | 5 |
107
+
108
+ Scenario: a if-statement with compound-statements in a line
109
+ Given a target source named "fixture.c" with:
110
+ """
111
+ int foo(int i)
112
+ {
113
+ if (i == 0) { return 0; } /* OK */
114
+ return 1;
115
+ }
116
+ """
117
+ When I successfully run `adlint fixture.c` on noarch
118
+ Then the output should exactly match with:
119
+ | mesg | line | column |
120
+ | W0117 | 1 | 5 |
121
+ | W0104 | 1 | 13 |
122
+ | W1071 | 1 | 5 |
123
+ | W0628 | 1 | 5 |
124
+
125
+ Scenario: a if-statement in a line
126
+ Given a target source named "fixture.c" with:
127
+ """
128
+ int foo(int i)
129
+ {
130
+ if (i == 0) return 0; /* OK */
131
+ return 1;
132
+ }
133
+ """
134
+ When I successfully run `adlint fixture.c` on noarch
135
+ Then the output should exactly match with:
136
+ | mesg | line | column |
137
+ | W0117 | 1 | 5 |
138
+ | W0104 | 1 | 13 |
139
+ | W1071 | 1 | 5 |
140
+ | W0414 | 3 | 17 |
141
+ | W0628 | 1 | 5 |
142
+
143
+ Scenario: a for-statement in a line
144
+ Given a target source named "fixture.c" with:
145
+ """
146
+ int foo(int i)
147
+ {
148
+ int j, k = 1; /* W0425 */
149
+ for (j = 0; j < i; j++) k *= 2; /* OK */
150
+ return k;
151
+ }
152
+ """
153
+ When I successfully run `adlint fixture.c` on noarch
154
+ Then the output should exactly match with:
155
+ | mesg | line | column |
156
+ | W0117 | 1 | 5 |
157
+ | W0104 | 1 | 13 |
158
+ | W0414 | 4 | 29 |
159
+ | W0425 | 3 | 12 |
160
+ | W0628 | 1 | 5 |
161
+
162
+ Scenario: a for-statement with a compound-statement in a line
163
+ Given a target source named "fixture.c" with:
164
+ """
165
+ int foo(int i)
166
+ {
167
+ int j, k = 1; /* W0425 */
168
+ for (j = 0; j < i; j++) { k *= 2; } /* OK */
169
+ return k;
170
+ }
171
+ """
172
+ When I successfully run `adlint fixture.c` on noarch
173
+ Then the output should exactly match with:
174
+ | mesg | line | column |
175
+ | W0117 | 1 | 5 |
176
+ | W0104 | 1 | 13 |
177
+ | W0425 | 3 | 12 |
178
+ | W0628 | 1 | 5 |
179
+
180
+ Scenario: extra statement after if-statement in a line
181
+ Given a target source named "fixture.c" with:
182
+ """
183
+ int foo(int i)
184
+ {
185
+ if (i == 0) return 0; return 1; /* W0425 */
186
+ }
187
+ """
188
+ When I successfully run `adlint fixture.c` on noarch
189
+ Then the output should exactly match with:
190
+ | mesg | line | column |
191
+ | W0117 | 1 | 5 |
192
+ | W0104 | 1 | 13 |
193
+ | W1071 | 1 | 5 |
194
+ | W0414 | 3 | 17 |
195
+ | W0425 | 3 | 27 |
196
+ | W0628 | 1 | 5 |
197
+
198
+ Scenario: extra statement after for-statement in a line
199
+ Given a target source named "fixture.c" with:
200
+ """
201
+ int foo(int i)
202
+ {
203
+ int j, k = 1; /* W0425 */
204
+ for (j = 0; j < i; j++) k *= 2; return k; /* W0425 */
205
+ }
206
+ """
207
+ When I successfully run `adlint fixture.c` on noarch
208
+ Then the output should exactly match with:
209
+ | mesg | line | column |
210
+ | W0117 | 1 | 5 |
211
+ | W0104 | 1 | 13 |
212
+ | W0414 | 4 | 29 |
213
+ | W0425 | 3 | 12 |
214
+ | W0425 | 4 | 37 |
215
+ | W0628 | 1 | 5 |
216
+
217
+ Scenario: two member-declarations in a line
218
+ Given a target source named "fixture.c" with:
219
+ """
220
+ struct foo { int i; int j; }; /* W0425 */
221
+ union bar { int i; int j; }; /* W0425 */
222
+ """
223
+ When I successfully run `adlint fixture.c` on noarch
224
+ Then the output should exactly match with:
225
+ | mesg | line | column |
226
+ | W0551 | 2 | 7 |
227
+ | W0425 | 1 | 25 |
228
+ | W0425 | 2 | 24 |
229
+
230
+ Scenario: two declarators in a member-declaration
231
+ Given a target source named "fixture.c" with:
232
+ """
233
+ struct foo { int *p, i; }; /* W0425 */
234
+ union bar { int *p, i; }; /* W0425 */
235
+ """
236
+ When I successfully run `adlint fixture.c` on noarch
237
+ Then the output should exactly match with:
238
+ | mesg | line | column |
239
+ | W0551 | 2 | 7 |
240
+ | W0425 | 1 | 22 |
241
+ | W0425 | 2 | 21 |
242
+
243
+ Scenario: two declarators in a member-declaration
244
+ Given a target source named "fixture.c" with:
245
+ """
246
+ extern struct { int i; } foo; /* OK */
247
+ extern union { int i; } bar; /* OK */
248
+ typedef struct { int i; } baz; /* OK */
249
+ typedef union { int i; } qux; /* OK */
250
+ """
251
+ When I successfully run `adlint fixture.c` on noarch
252
+ Then the output should exactly match with:
253
+ | mesg | line | column |
254
+ | W0118 | 1 | 26 |
255
+ | W0118 | 2 | 25 |
256
+ | W0551 | 2 | 8 |
257
+ | W0551 | 4 | 9 |
258
+
259
+ Scenario: two declarators in a member-declaration
260
+ Given a target source named "fixture.c" with:
261
+ """
262
+ extern struct { int *p, i; } foo; /* W0425 */
263
+ extern union { int *p, i; } bar; /* W0425 */
264
+ typedef struct { int *p, i; } baz; /* W0425 */
265
+ typedef union { int *p, i; } qux; /* W0425 */
266
+ """
267
+ When I successfully run `adlint fixture.c` on noarch
268
+ Then the output should exactly match with:
269
+ | mesg | line | column |
270
+ | W0118 | 1 | 30 |
271
+ | W0118 | 2 | 29 |
272
+ | W0551 | 2 | 8 |
273
+ | W0551 | 4 | 9 |
274
+ | W0425 | 1 | 25 |
275
+ | W0425 | 2 | 24 |
276
+ | W0425 | 3 | 26 |
277
+ | W0425 | 4 | 25 |
278
+
279
+ # vim:ts=2:sw=2:sts=2:et:
@@ -2,7 +2,7 @@ Feature: W0692
2
2
 
3
3
  W0692 detects that no argument is given to a function-like macro.
4
4
 
5
- Scenario: no argument to a function-like macro
5
+ Scenario: empty argument to a function-like macro
6
6
  Given a target source named "fixture.c" with:
7
7
  """
8
8
  #define MACRO(a) #a
@@ -29,4 +29,17 @@ Feature: W0692
29
29
  | W0442 | 1 | 1 |
30
30
  | W0117 | 3 | 13 |
31
31
 
32
+ Scenario: no argument to a function-like macro
33
+ Given a target source named "fixture.c" with:
34
+ """
35
+ #define MACRO() 0
36
+
37
+ const int i = MACRO(); /* W0692 */
38
+ """
39
+ When I successfully run `adlint fixture.c` on noarch
40
+ Then the output should exactly match with:
41
+ | mesg | line | column |
42
+ | W0442 | 1 | 1 |
43
+ | W0117 | 3 | 11 |
44
+
32
45
  # vim:ts=2:sw=2:sts=2:et:
@@ -116,7 +116,9 @@ Feature: W0834
116
116
  Scenario: `long long' in sizeof-expression
117
117
  Given a target source named "fixture.c" with:
118
118
  """
119
- static int foo(void)
119
+ #include <stddef.h>
120
+
121
+ static size_t foo(void)
120
122
  {
121
123
  return sizeof(long long); /* W0834 */
122
124
  }
@@ -124,10 +126,10 @@ Feature: W0834
124
126
  When I successfully run `adlint fixture.c` on noarch
125
127
  Then the output should exactly match with:
126
128
  | mesg | line | column |
127
- | W1076 | 1 | 12 |
128
- | W0629 | 1 | 12 |
129
- | W0834 | 3 | 19 |
130
- | W0628 | 1 | 12 |
129
+ | W1076 | 3 | 15 |
130
+ | W0629 | 3 | 15 |
131
+ | W0834 | 5 | 19 |
132
+ | W0628 | 3 | 15 |
131
133
 
132
134
  Scenario: multiple `long long' parameters in function declaration
133
135
  Given a target source named "fixture.c" with:
@@ -78,7 +78,6 @@ Feature: W1073
78
78
  | mesg | line | column |
79
79
  | W0118 | 1 | 12 |
80
80
  | W1076 | 2 | 13 |
81
- | W0100 | 5 | 9 |
82
81
  | W1073 | 6 | 20 |
83
82
  | W0629 | 2 | 13 |
84
83
  | W0535 | 6 | 10 |
@@ -23,6 +23,7 @@ Feature: W1074
23
23
  | mesg | line | column |
24
24
  | W1076 | 1 | 12 |
25
25
  | W0612 | 5 | 21 |
26
+ | W0168 | 5 | 24 |
26
27
  | W0609 | 5 | 21 |
27
28
  | W0629 | 1 | 12 |
28
29
  | W1074 | 5 | 15 |
@@ -49,6 +50,8 @@ Feature: W1074
49
50
  | mesg | line | column |
50
51
  | W1076 | 1 | 12 |
51
52
  | W0613 | 5 | 33 |
53
+ | W0168 | 5 | 16 |
54
+ | W0168 | 5 | 36 |
52
55
  | W0610 | 5 | 33 |
53
56
  | W0629 | 1 | 12 |
54
57
  | W1074 | 5 | 26 |
@@ -75,6 +78,7 @@ Feature: W1074
75
78
  | mesg | line | column |
76
79
  | W1076 | 1 | 12 |
77
80
  | W0612 | 5 | 20 |
81
+ | W0168 | 5 | 23 |
78
82
  | W0609 | 5 | 20 |
79
83
  | W0629 | 1 | 12 |
80
84
  | W1074 | 5 | 17 |
@@ -102,6 +106,7 @@ Feature: W1074
102
106
  | W0118 | 1 | 12 |
103
107
  | W1076 | 3 | 12 |
104
108
  | W0612 | 5 | 23 |
109
+ | W0168 | 5 | 26 |
105
110
  | W0609 | 5 | 23 |
106
111
  | W1073 | 5 | 19 |
107
112
  | W0629 | 3 | 12 |
@@ -131,6 +136,7 @@ Feature: W1074
131
136
  | W1077 | 1 | 12 |
132
137
  | W1076 | 3 | 12 |
133
138
  | W0612 | 5 | 22 |
139
+ | W0168 | 5 | 25 |
134
140
  | W0609 | 5 | 22 |
135
141
  | W0629 | 3 | 12 |
136
142
  | W9001 | 9 | 9 |
@@ -127,4 +127,58 @@ Feature: W9003
127
127
  | W0502 | 5 | 9 |
128
128
  | W0628 | 3 | 12 |
129
129
 
130
+ Scenario: no implicit conversion of size_t value
131
+ Given a target source named "fixture.c" with:
132
+ """
133
+ #include <stddef.h>
134
+
135
+ size_t foo(int a)
136
+ {
137
+ return sizeof(a); /* OK */
138
+ }
139
+ """
140
+ When I successfully run `adlint fixture.c` on noarch
141
+ Then the output should exactly match with:
142
+ | mesg | line | column |
143
+ | W0117 | 3 | 8 |
144
+ | W0104 | 3 | 16 |
145
+ | W0628 | 3 | 8 |
146
+
147
+ Scenario: implicit conversion of size_t value
148
+ Given a target source named "fixture.c" with:
149
+ """
150
+ #include <stddef.h>
151
+
152
+ int foo(int a)
153
+ {
154
+ return sizeof(a); /* W9003 */
155
+ }
156
+ """
157
+ When I successfully run `adlint fixture.c` on noarch
158
+ Then the output should exactly match with:
159
+ | mesg | line | column |
160
+ | W0117 | 3 | 5 |
161
+ | W0150 | 5 | 12 |
162
+ | W9003 | 5 | 12 |
163
+ | W0286 | 5 | 5 |
164
+ | W0104 | 3 | 13 |
165
+ | W0628 | 3 | 5 |
166
+
167
+ Scenario: explicit conversion of size_t value
168
+ Given a target source named "fixture.c" with:
169
+ """
170
+ #include <stddef.h>
171
+
172
+ int foo(int a)
173
+ {
174
+ return (int) sizeof(a); /* OK */
175
+ }
176
+ """
177
+ When I successfully run `adlint fixture.c` on noarch
178
+ Then the output should exactly match with:
179
+ | mesg | line | column |
180
+ | W0117 | 3 | 5 |
181
+ | W0104 | 3 | 13 |
182
+ | W0628 | 3 | 5 |
183
+
130
184
  # vim:ts=2:sw=2:sts=2:et:
@@ -1,11 +1,12 @@
1
1
  NOARCH_TRAITS = <<EOF
2
- version: "2.0.0"
2
+ version: "2.4.0"
3
3
 
4
4
  exam_packages:
5
5
  - "c_builtin"
6
6
 
7
7
  project_traits:
8
8
  project_name: "features"
9
+ project_root: "."
9
10
  include_path:
10
11
  initial_header: "empty_pinit.h"
11
12
  coding_style:
@@ -71,7 +72,8 @@ linker_traits:
71
72
  message_traits:
72
73
  language: "ja_JP"
73
74
  message_with_class: false
74
- warn_only_files_in:
75
+ warn_files_in:
76
+ warn_files_not_in:
75
77
  individual_selection: true
76
78
  exclusion:
77
79
  inclusion:
@@ -111,6 +113,15 @@ DUMMY_ASSERT_H = <<EOF
111
113
  #endif
112
114
  EOF
113
115
 
116
+ DUMMY_STDDEF_H = <<EOF
117
+ #if !defined(DUMMY_STDDEF_H)
118
+ #define DUMMY_STDDEF_H
119
+
120
+ typedef unsigned long size_t;
121
+
122
+ #endif
123
+ EOF
124
+
114
125
  require "pathname"
115
126
  require "stringio"
116
127
 
@@ -135,7 +146,7 @@ def run_adlint(cmd, *args)
135
146
  create_adlint_files
136
147
  cd_to_tmpdir do
137
148
  $all_output = exec(cmd, *args).each_line.map { |line|
138
- if line =~ /_pinit\.h|_cinit\.h|stdio\.h|math\.h|assert\.h/
149
+ if line =~ /_pinit\.h|_cinit\.h|stdio\.h|math\.h|assert\.h|stddef\.h/
139
150
  nil
140
151
  else
141
152
  line.chomp
@@ -181,6 +192,7 @@ def create_adlint_files
181
192
  create_file("stdio.h", DUMMY_STDIO_H)
182
193
  create_file("math.h", DUMMY_MATH_H)
183
194
  create_file("assert.h", DUMMY_ASSERT_H)
195
+ create_file("stddef.h", DUMMY_STDDEF_H)
184
196
  end
185
197
  end
186
198
 
data/lib/adlint/c/expr.rb CHANGED
@@ -1664,14 +1664,20 @@ module C #:nodoc:
1664
1664
  def visit_sizeof_expression(node)
1665
1665
  checkpoint(node.location)
1666
1666
 
1667
+ if size_t_type = type_of(UserTypeId.new("size_t"))
1668
+ result_type = size_t_type
1669
+ else
1670
+ result_type = unsigned_long_type
1671
+ end
1672
+
1667
1673
  object = node.operand.accept(self)
1668
1674
  if object.variable?
1669
1675
  variable = object
1670
1676
  result = temporary_variable(
1671
- int_type, ScalarValue.of(variable.type.aligned_byte_size))
1677
+ result_type, ScalarValue.of(variable.type.aligned_byte_size))
1672
1678
  notify_sizeof_expr_evaled(node, variable, result)
1673
1679
  else
1674
- result = temporary_variable(int_type)
1680
+ result = temporary_variable(result_type)
1675
1681
  end
1676
1682
 
1677
1683
  result
@@ -1682,8 +1688,14 @@ module C #:nodoc:
1682
1688
 
1683
1689
  resolve_unresolved_type(node.operand)
1684
1690
 
1691
+ if size_t_type = type_of(UserTypeId.new("size_t"))
1692
+ result_type = size_t_type
1693
+ else
1694
+ result_type = unsigned_long_type
1695
+ end
1696
+
1685
1697
  result = temporary_variable(
1686
- int_type, ScalarValue.of(node.operand.type.aligned_byte_size))
1698
+ result_type, ScalarValue.of(node.operand.type.aligned_byte_size))
1687
1699
  notify_sizeof_type_expr_evaled(node, node.operand.type, result)
1688
1700
 
1689
1701
  result
@@ -1692,13 +1704,19 @@ module C #:nodoc:
1692
1704
  def visit_alignof_expression(node)
1693
1705
  checkpoint(node.location)
1694
1706
 
1707
+ if size_t_type = type_of(UserTypeId.new("size_t"))
1708
+ result_type = size_t_type
1709
+ else
1710
+ result_type = unsigned_long_type
1711
+ end
1712
+
1695
1713
  object = node.operand.accept(self)
1696
1714
  if object.variable?
1697
1715
  variable = object
1698
- temporary_variable(int_type,
1716
+ temporary_variable(result_type,
1699
1717
  ScalarValue.of(variable.type.byte_alignment))
1700
1718
  else
1701
- temporary_variable(int_type)
1719
+ temporary_variable(result_type)
1702
1720
  end
1703
1721
  end
1704
1722
 
@@ -1707,7 +1725,13 @@ module C #:nodoc:
1707
1725
 
1708
1726
  resolve_unresolved_type(node.operand)
1709
1727
 
1710
- temporary_variable(int_type,
1728
+ if size_t_type = type_of(UserTypeId.new("size_t"))
1729
+ result_type = size_t_type
1730
+ else
1731
+ result_type = unsigned_long_type
1732
+ end
1733
+
1734
+ temporary_variable(result_type,
1711
1735
  ScalarValue.of(node.operand.type.aligned_byte_size))
1712
1736
  end
1713
1737
 
@@ -924,6 +924,10 @@ module C #:nodoc:
924
924
  end
925
925
 
926
926
  def lookup_or_define_function(function_definition)
927
+ function_definition.type.declarations.each do |decl|
928
+ decl.mark_as_referred_by(function_definition.identifier)
929
+ end
930
+
927
931
  if function = function_named(function_definition.identifier.value)
928
932
  function.declarations_and_definitions.each do |decl_or_def|
929
933
  decl_or_def.mark_as_referred_by(function_definition.identifier)
@@ -684,14 +684,19 @@ module Cpp #:nodoc:
684
684
  include_paths += Traits.instance.of_project.include_path
685
685
  include_paths += Traits.instance.of_compiler.include_path
686
686
 
687
- result = []
688
- include_paths.each do |dpath|
689
- fpath = dpath.join(Pathname.new(basename))
690
- fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
691
- result.push(fpath) if fpath.readable?
692
- break if result.size == max_num
687
+ base_fpath = Pathname.new(basename)
688
+ if base_fpath.absolute? && base_fpath.readable?
689
+ return [base_fpath]
690
+ else
691
+ result = []
692
+ include_paths.each do |dpath|
693
+ fpath = dpath.join(base_fpath)
694
+ fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
695
+ result.push(fpath) if fpath.readable?
696
+ break if result.size == max_num
697
+ end
698
+ result
693
699
  end
694
- result
695
700
  end
696
701
 
697
702
  def resolve_first_system_header(basename)
@@ -706,14 +711,19 @@ module Cpp #:nodoc:
706
711
  include_paths = Traits.instance.of_project.include_path
707
712
  include_paths += Traits.instance.of_compiler.include_path
708
713
 
709
- result = []
710
- include_paths.each do |dpath|
711
- fpath = dpath.join(Pathname.new(basename))
712
- fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
713
- result.push(fpath) if fpath.readable?
714
- break if result.size == max_num
714
+ base_fpath = Pathname.new(basename)
715
+ if base_fpath.absolute? && base_fpath.readable?
716
+ return [base_fpath]
717
+ else
718
+ result = []
719
+ include_paths.each do |dpath|
720
+ fpath = dpath.join(base_fpath)
721
+ fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
722
+ result.push(fpath) if fpath.readable?
723
+ break if result.size == max_num
724
+ end
725
+ result
715
726
  end
716
- result
717
727
  end
718
728
 
719
729
  def macro_defined?(context, identifier)