adlint 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/ChangeLog +265 -0
  2. data/MANIFEST +15 -0
  3. data/NEWS +30 -4
  4. data/etc/conf.d/noarch/adlint_all_bat.erb +1 -1
  5. data/etc/mesg.d/en_US/messages.yml +3 -3
  6. data/etc/mesg.d/ja_JP/messages.yml +3 -3
  7. data/features/message_detection/W0001.feature +2 -0
  8. data/features/message_detection/W0007.feature +8 -0
  9. data/features/message_detection/W0010.feature +4 -1
  10. data/features/message_detection/W0013.feature +8 -0
  11. data/features/message_detection/W0093.feature +3 -0
  12. data/features/message_detection/W0104.feature +7 -0
  13. data/features/message_detection/W0643.feature +80 -0
  14. data/features/message_detection/W0646.feature +115 -0
  15. data/features/message_detection/W0691.feature +100 -0
  16. data/features/message_detection/W0692.feature +32 -0
  17. data/features/message_detection/W0694.feature +128 -0
  18. data/features/message_detection/W0716.feature +3 -0
  19. data/features/message_detection/W0717.feature +3 -0
  20. data/features/message_detection/W0718.feature +3 -0
  21. data/features/message_detection/W0723.feature +2 -0
  22. data/features/message_detection/W0732.feature +3 -0
  23. data/features/message_detection/W0733.feature +3 -0
  24. data/features/message_detection/W0734.feature +8 -0
  25. data/features/message_detection/W0735.feature +8 -0
  26. data/features/message_detection/W0805.feature +92 -0
  27. data/features/message_detection/W0811.feature +79 -0
  28. data/features/message_detection/W1031.feature +7 -0
  29. data/features/message_detection/W1040.feature +89 -0
  30. data/features/message_detection/W1041.feature +15 -0
  31. data/features/message_detection/W1046.feature +60 -0
  32. data/features/message_detection/W1052.feature +3 -0
  33. data/features/message_detection/W1066.feature +3 -0
  34. data/features/message_detection/W1067.feature +3 -0
  35. data/features/message_detection/W1068.feature +3 -0
  36. data/features/message_detection/W1069.feature +5 -0
  37. data/features/message_detection/W1070.feature +6 -0
  38. data/features/message_detection/W1072.feature +1 -0
  39. data/features/message_detection/W1073.feature +145 -0
  40. data/features/message_detection/W1074.feature +139 -0
  41. data/features/message_detection/W1075.feature +86 -0
  42. data/features/message_detection/W1076.feature +66 -0
  43. data/features/message_detection/W1077.feature +105 -0
  44. data/features/message_detection/W9003.feature +4 -0
  45. data/lib/adlint/c/ctrlexpr.rb +3 -0
  46. data/lib/adlint/c/interp.rb +11 -5
  47. data/lib/adlint/c/lexer.rb +14 -3
  48. data/lib/adlint/c/message.rb +192 -0
  49. data/lib/adlint/c/parser.rb +19 -3
  50. data/lib/adlint/c/parser.y +18 -2
  51. data/lib/adlint/c/phase.rb +19 -6
  52. data/lib/adlint/c/syntax.rb +6 -0
  53. data/lib/adlint/c/type.rb +5 -1
  54. data/lib/adlint/cpp/constexpr.rb +3 -3
  55. data/lib/adlint/cpp/constexpr.y +3 -3
  56. data/lib/adlint/cpp/eval.rb +60 -86
  57. data/lib/adlint/cpp/lexer.rb +82 -28
  58. data/lib/adlint/cpp/macro.rb +64 -35
  59. data/lib/adlint/cpp/message.rb +137 -4
  60. data/lib/adlint/cpp/phase.rb +8 -0
  61. data/lib/adlint/cpp/syntax.rb +25 -0
  62. data/lib/adlint/lang.rb +2 -1
  63. data/lib/adlint/version.rb +2 -2
  64. data/share/doc/developers_guide_ja.html +3 -3
  65. data/share/doc/developers_guide_ja.texi +1 -1
  66. data/share/doc/users_guide_en.html +102 -85
  67. data/share/doc/users_guide_en.texi +85 -69
  68. data/share/doc/users_guide_ja.html +102 -94
  69. data/share/doc/users_guide_ja.texi +85 -77
  70. metadata +17 -2
@@ -13,7 +13,7 @@ Feature: W0010
13
13
  When I successfully run `adlint W0010.c` on noarch
14
14
  Then the output should exactly match with:
15
15
  | mesg | line | column |
16
- | W0597 | 3 | 20 |
16
+ | W1076 | 1 | 12 |
17
17
  | W0104 | 1 | 20 |
18
18
  | W0629 | 1 | 12 |
19
19
  | W0010 | 3 | 20 |
@@ -30,6 +30,7 @@ Feature: W0010
30
30
  When I successfully run `adlint W0010.c` on noarch
31
31
  Then the output should exactly match with:
32
32
  | mesg | line | column |
33
+ | W1076 | 1 | 12 |
33
34
  | W0104 | 1 | 20 |
34
35
  | W0629 | 1 | 12 |
35
36
  | W0010 | 3 | 20 |
@@ -47,6 +48,7 @@ Feature: W0010
47
48
  When I successfully run `adlint W0010.c` on noarch
48
49
  Then the output should exactly match with:
49
50
  | mesg | line | column |
51
+ | W1076 | 1 | 12 |
50
52
  | W0556 | 3 | 25 |
51
53
  | W0104 | 1 | 20 |
52
54
  | W0104 | 1 | 27 |
@@ -65,6 +67,7 @@ Feature: W0010
65
67
  When I successfully run `adlint W0010.c` on noarch
66
68
  Then the output should exactly match with:
67
69
  | mesg | line | column |
70
+ | W1076 | 1 | 12 |
68
71
  | W0723 | 3 | 32 |
69
72
  | W0104 | 1 | 20 |
70
73
  | W0104 | 1 | 27 |
@@ -21,6 +21,7 @@ Feature: W0013
21
21
  When I successfully run `adlint W0013.c` on noarch
22
22
  Then the output should exactly match with:
23
23
  | mesg | line | column |
24
+ | W1076 | 1 | 13 |
24
25
  | W0629 | 1 | 13 |
25
26
  | W0535 | 6 | 10 |
26
27
  | W0013 | 9 | 13 |
@@ -44,6 +45,7 @@ Feature: W0013
44
45
  When I successfully run `adlint W0013.c` on noarch
45
46
  Then the output should exactly match with:
46
47
  | mesg | line | column |
48
+ | W1076 | 1 | 13 |
47
49
  | W0629 | 1 | 13 |
48
50
  | W0013 | 8 | 13 |
49
51
  | W0628 | 1 | 13 |
@@ -68,6 +70,7 @@ Feature: W0013
68
70
  When I successfully run `adlint W0013.c` on noarch
69
71
  Then the output should exactly match with:
70
72
  | mesg | line | column |
73
+ | W1076 | 1 | 13 |
71
74
  | W0629 | 1 | 13 |
72
75
  | W0013 | 10 | 13 |
73
76
  | W0628 | 1 | 13 |
@@ -92,6 +95,7 @@ Feature: W0013
92
95
  When I successfully run `adlint W0013.c` on noarch
93
96
  Then the output should exactly match with:
94
97
  | mesg | line | column |
98
+ | W1076 | 1 | 13 |
95
99
  | W0629 | 1 | 13 |
96
100
  | W0013 | 10 | 13 |
97
101
  | W0628 | 1 | 13 |
@@ -115,6 +119,7 @@ Feature: W0013
115
119
  When I successfully run `adlint W0013.c` on noarch
116
120
  Then the output should exactly match with:
117
121
  | mesg | line | column |
122
+ | W1076 | 1 | 13 |
118
123
  | W0629 | 1 | 13 |
119
124
  | W0535 | 6 | 10 |
120
125
  | W0628 | 1 | 13 |
@@ -137,6 +142,7 @@ Feature: W0013
137
142
  When I successfully run `adlint W0013.c` on noarch
138
143
  Then the output should exactly match with:
139
144
  | mesg | line | column |
145
+ | W1076 | 1 | 13 |
140
146
  | W0629 | 1 | 13 |
141
147
  | W0628 | 1 | 13 |
142
148
 
@@ -160,6 +166,7 @@ Feature: W0013
160
166
  When I successfully run `adlint W0013.c` on noarch
161
167
  Then the output should exactly match with:
162
168
  | mesg | line | column |
169
+ | W1076 | 1 | 13 |
163
170
  | W0629 | 1 | 13 |
164
171
  | W0628 | 1 | 13 |
165
172
 
@@ -183,6 +190,7 @@ Feature: W0013
183
190
  When I successfully run `adlint W0013.c` on noarch
184
191
  Then the output should exactly match with:
185
192
  | mesg | line | column |
193
+ | W1076 | 1 | 13 |
186
194
  | W0629 | 1 | 13 |
187
195
  | W0628 | 1 | 13 |
188
196
 
@@ -25,6 +25,7 @@ Feature: W0093
25
25
  When I successfully run `adlint W0093.c` on noarch
26
26
  Then the output should exactly match with:
27
27
  | mesg | line | column |
28
+ | W1076 | 1 | 13 |
28
29
  | W0093 | 8 | 23 |
29
30
  | W0093 | 11 | 23 |
30
31
  | W0629 | 1 | 13 |
@@ -53,6 +54,7 @@ Feature: W0093
53
54
  When I successfully run `adlint W0093.c` on noarch
54
55
  Then the output should exactly match with:
55
56
  | mesg | line | column |
57
+ | W1076 | 1 | 13 |
56
58
  | W0093 | 11 | 23 |
57
59
  | W0629 | 1 | 13 |
58
60
  | W0628 | 1 | 13 |
@@ -80,6 +82,7 @@ Feature: W0093
80
82
  When I successfully run `adlint W0093.c` on noarch
81
83
  Then the output should exactly match with:
82
84
  | mesg | line | column |
85
+ | W1076 | 1 | 13 |
83
86
  | W0093 | 8 | 23 |
84
87
  | W0629 | 1 | 13 |
85
88
  | W0628 | 1 | 13 |
@@ -13,6 +13,7 @@ Feature: W0104
13
13
  When I successfully run `adlint W0104.c` on noarch
14
14
  Then the output should exactly match with:
15
15
  | mesg | line | column |
16
+ | W1076 | 1 | 12 |
16
17
  | W0723 | 3 | 14 |
17
18
  | W0104 | 1 | 21 |
18
19
  | W0629 | 1 | 12 |
@@ -29,6 +30,7 @@ Feature: W0104
29
30
  When I successfully run `adlint W0104.c` on noarch
30
31
  Then the output should exactly match with:
31
32
  | mesg | line | column |
33
+ | W1076 | 1 | 12 |
32
34
  | W0723 | 3 | 14 |
33
35
  | W0629 | 1 | 12 |
34
36
  | W0628 | 1 | 12 |
@@ -44,6 +46,7 @@ Feature: W0104
44
46
  When I successfully run `adlint W0104.c` on noarch
45
47
  Then the output should exactly match with:
46
48
  | mesg | line | column |
49
+ | W1076 | 1 | 12 |
47
50
  | W0723 | 3 | 14 |
48
51
  | W0629 | 1 | 12 |
49
52
  | W0628 | 1 | 12 |
@@ -59,6 +62,7 @@ Feature: W0104
59
62
  When I successfully run `adlint W0104.c` on noarch
60
63
  Then the output should exactly match with:
61
64
  | mesg | line | column |
65
+ | W1076 | 1 | 12 |
62
66
  | W0723 | 3 | 14 |
63
67
  | W0629 | 1 | 12 |
64
68
  | W0628 | 1 | 12 |
@@ -74,6 +78,7 @@ Feature: W0104
74
78
  When I successfully run `adlint W0104.c` on noarch
75
79
  Then the output should exactly match with:
76
80
  | mesg | line | column |
81
+ | W1076 | 1 | 12 |
77
82
  | W0723 | 3 | 14 |
78
83
  | W0629 | 1 | 12 |
79
84
  | W0628 | 1 | 12 |
@@ -89,6 +94,7 @@ Feature: W0104
89
94
  When I successfully run `adlint W0104.c` on noarch
90
95
  Then the output should exactly match with:
91
96
  | mesg | line | column |
97
+ | W1076 | 1 | 12 |
92
98
  | W0723 | 3 | 14 |
93
99
  | W0629 | 1 | 12 |
94
100
  | W0628 | 1 | 12 |
@@ -104,6 +110,7 @@ Feature: W0104
104
110
  When I successfully run `adlint W0104.c` on noarch
105
111
  Then the output should exactly match with:
106
112
  | mesg | line | column |
113
+ | W1076 | 1 | 12 |
107
114
  | W0723 | 3 | 14 |
108
115
  | W0629 | 1 | 12 |
109
116
  | W0628 | 1 | 12 |
@@ -0,0 +1,80 @@
1
+ Feature: W0643
2
+
3
+ W0643 detects that the last backslash of argument tokens will confuse the `#'
4
+ operator in the function-like macro.
5
+
6
+ Scenario: one backslash
7
+ Given a target source named "W0643.c" with:
8
+ """
9
+ #define MACRO(x) #x
10
+ const char *str = MACRO(foo\); /* W0643 */
11
+ """
12
+ When I successfully run `adlint W0643.c` on noarch
13
+ Then the output should exactly match with:
14
+ | mesg | line | column |
15
+ | W0442 | 1 | 1 |
16
+ | W0643 | 2 | 28 |
17
+ | W0117 | 2 | 13 |
18
+
19
+ Scenario: two backslashes
20
+ Given a target source named "W0643.c" with:
21
+ """
22
+ #define MACRO(x) #x
23
+ const char *str = MACRO(foo\\); /* OK */
24
+ """
25
+ When I successfully run `adlint W0643.c` on noarch
26
+ Then the output should exactly match with:
27
+ | mesg | line | column |
28
+ | W0442 | 1 | 1 |
29
+ | W0117 | 2 | 13 |
30
+
31
+ Scenario: three backslashes
32
+ Given a target source named "W0643.c" with:
33
+ """
34
+ #define MACRO(x) #x
35
+ const char *str = MACRO(foo\\\); /* W0643 */
36
+ """
37
+ When I successfully run `adlint W0643.c` on noarch
38
+ Then the output should exactly match with:
39
+ | mesg | line | column |
40
+ | W0442 | 1 | 1 |
41
+ | W0643 | 2 | 30 |
42
+ | W0117 | 2 | 13 |
43
+
44
+ Scenario: four backslashes
45
+ Given a target source named "W0643.c" with:
46
+ """
47
+ #define MACRO(x) #x
48
+ const char *str = MACRO(foo\\\\); /* OK */
49
+ """
50
+ When I successfully run `adlint W0643.c` on noarch
51
+ Then the output should exactly match with:
52
+ | mesg | line | column |
53
+ | W0442 | 1 | 1 |
54
+ | W0117 | 2 | 13 |
55
+
56
+ Scenario: no backslashes
57
+ Given a target source named "W0643.c" with:
58
+ """
59
+ #define MACRO(x) #x
60
+ const char *str = MACRO(foo); /* OK */
61
+ """
62
+ When I successfully run `adlint W0643.c` on noarch
63
+ Then the output should exactly match with:
64
+ | mesg | line | column |
65
+ | W0442 | 1 | 1 |
66
+ | W0117 | 2 | 13 |
67
+
68
+ Scenario: backslashes middle of argument tokens
69
+ Given a target source named "W0643.c" with:
70
+ """
71
+ #define MACRO(x) #x
72
+ const char *str = MACRO(foo \ bar \\ baz); /* OK */
73
+ """
74
+ When I successfully run `adlint W0643.c` on noarch
75
+ Then the output should exactly match with:
76
+ | mesg | line | column |
77
+ | W0442 | 1 | 1 |
78
+ | W0117 | 2 | 13 |
79
+
80
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,115 @@
1
+ Feature: W0646
2
+
3
+ W0646 detects that a string-literal of narrow characters and a string-literal
4
+ of wide characters are neighboring.
5
+
6
+ Scenario: a string-literal of narrow characters followed by one of wide
7
+ characters
8
+ Given a target source named "W0646.c" with:
9
+ """
10
+ static const char *str = "foo" L"bar"; /* W0646 */
11
+ """
12
+ When I successfully run `adlint W0646.c` on noarch
13
+ Then the output should exactly match with:
14
+ | mesg | line | column |
15
+ | W0646 | 1 | 32 |
16
+ | W0947 | 1 | 26 |
17
+
18
+ Scenario: a string-literal of narrow characters followed by a compatible
19
+ string-literal
20
+ Given a target source named "W0646.c" with:
21
+ """
22
+ static const char *str = "foo" "bar"; /* OK */
23
+ """
24
+ When I successfully run `adlint W0646.c` on noarch
25
+ Then the output should exactly match with:
26
+ | mesg | line | column |
27
+ | W0947 | 1 | 26 |
28
+
29
+ Scenario: a string-literal of wide characters followed by one of narrow
30
+ characters
31
+ Given a target source named "W0646.c" with:
32
+ """
33
+ static const char *str = L"foo" "bar"; /* W0646 */
34
+ """
35
+ When I successfully run `adlint W0646.c` on noarch
36
+ Then the output should exactly match with:
37
+ | mesg | line | column |
38
+ | W0646 | 1 | 33 |
39
+ | W9003 | 1 | 26 |
40
+ | W0626 | 1 | 26 |
41
+ | W0947 | 1 | 26 |
42
+
43
+ Scenario: a string-literal of wide characters followed by a compatible
44
+ string-literal
45
+ Given a target source named "W0646.c" with:
46
+ """
47
+ static const char *str = L"foo" L"bar"; /* OK */
48
+ """
49
+ When I successfully run `adlint W0646.c` on noarch
50
+ Then the output should exactly match with:
51
+ | mesg | line | column |
52
+ | W9003 | 1 | 26 |
53
+ | W0626 | 1 | 26 |
54
+ | W0947 | 1 | 26 |
55
+
56
+ Scenario: a string-literal of narrow characters followed by one of wide
57
+ characters those are replaced by macros
58
+ Given a target source named "W0646.c" with:
59
+ """
60
+ #define STR1 "foo"
61
+ #define STR2 L"bar"
62
+
63
+ static const char *str = STR1 STR2; /* W0646 */
64
+ """
65
+ When I successfully run `adlint W0646.c` on noarch
66
+ Then the output should exactly match with:
67
+ | mesg | line | column |
68
+ | W0646 | 4 | 31 |
69
+
70
+ Scenario: a string-literal of narrow characters followed by a compatible
71
+ string-literal those are replaced by macros
72
+ Given a target source named "W0646.c" with:
73
+ """
74
+ #define STR1 "foo"
75
+ #define STR2 "bar"
76
+
77
+ static const char *str = STR1 STR2; /* OK */
78
+ """
79
+ When I successfully run `adlint W0646.c` on noarch
80
+ Then the output should exactly match with:
81
+ | mesg | line | column |
82
+ | W0947 | 1 | 26 |
83
+
84
+ Scenario: a string-literal of wide characters followed by one of narrow
85
+ characters those are replaced by macros
86
+ Given a target source named "W0646.c" with:
87
+ """
88
+ #define STR1 L"foo"
89
+ #define STR2 "bar"
90
+
91
+ static const char *str = STR1 STR2; /* W0646 */
92
+ """
93
+ When I successfully run `adlint W0646.c` on noarch
94
+ Then the output should exactly match with:
95
+ | mesg | line | column |
96
+ | W0646 | 4 | 31 |
97
+ | W9003 | 4 | 26 |
98
+ | W0626 | 4 | 26 |
99
+
100
+ Scenario: a string-literal of wide characters followed by a compatible
101
+ string-literal those are replaced by macros
102
+ Given a target source named "W0646.c" with:
103
+ """
104
+ #define STR1 L"foo"
105
+ #define STR2 L"bar"
106
+
107
+ static const char *str = STR1 STR2; /* OK */
108
+ """
109
+ When I successfully run `adlint W0646.c` on noarch
110
+ Then the output should exactly match with:
111
+ | mesg | line | column |
112
+ | W9003 | 4 | 26 |
113
+ | W0626 | 4 | 26 |
114
+
115
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,100 @@
1
+ Feature: W0691
2
+
3
+ W0691 detects that `##' operator makes invalid preprocessing token.
4
+
5
+ Scenario: resulting a decimal-constant `123456'
6
+ Given a target source named "W0691.c" with:
7
+ """
8
+ #define MACRO(a, b) a ## b
9
+
10
+ double d = (double) MACRO(123, 456); /* OK */
11
+ """
12
+ When I successfully run `adlint W0691.c` on noarch
13
+ Then the output should exactly match with:
14
+ | mesg | line | column |
15
+ | W0442 | 1 | 1 |
16
+ | W0117 | 3 | 8 |
17
+
18
+ Scenario: resulting a floating-constant `.123'
19
+ Given a target source named "W0691.c" with:
20
+ """
21
+ #define MACRO(a, b) a ## b
22
+
23
+ double d = (double) MACRO(., 123); /* OK */
24
+ """
25
+ When I successfully run `adlint W0691.c` on noarch
26
+ Then the output should exactly match with:
27
+ | mesg | line | column |
28
+ | W0442 | 1 | 1 |
29
+ | W0117 | 3 | 8 |
30
+
31
+ Scenario: resulting a floating-constant `3.1415'.
32
+ Given a target source named "W0691.c" with:
33
+ """
34
+ #define MACRO(a, b) a ## b
35
+
36
+ double d = (double) MACRO(3., 1415); /* OK */
37
+ """
38
+ When I successfully run `adlint W0691.c` on noarch
39
+ Then the output should exactly match with:
40
+ | mesg | line | column |
41
+ | W0442 | 1 | 1 |
42
+ | W0117 | 3 | 8 |
43
+
44
+ Scenario: resulting a floating-constant `1.23e3'
45
+ Given a target source named "W0691.c" with:
46
+ """
47
+ #define MACRO(a, b) a ## b
48
+
49
+ double d = (double) MACRO(1.23, e3); /* OK */
50
+ """
51
+ When I successfully run `adlint W0691.c` on noarch
52
+ Then the output should exactly match with:
53
+ | mesg | line | column |
54
+ | W0442 | 1 | 1 |
55
+ | W0117 | 3 | 8 |
56
+
57
+ Scenario: resulting an expression `-123'
58
+ Given a target source named "W0691.c" with:
59
+ """
60
+ #define MACRO(a, b) a ## b
61
+
62
+ double d = (double) MACRO(-, 123); /* W0691 */
63
+ """
64
+ When I successfully run `adlint W0691.c` on noarch
65
+ Then the output should exactly match with:
66
+ | mesg | line | column |
67
+ | W0442 | 1 | 1 |
68
+ | W0691 | 3 | 21 |
69
+ | W0117 | 3 | 8 |
70
+
71
+ Scenario: resulting an expression `1 / 23'
72
+ Given a target source named "W0691.c" with:
73
+ """
74
+ #define MACRO(a, b) a ## b
75
+
76
+ double d = (double) MACRO(1/, 23); /* W0691 */
77
+ """
78
+ When I successfully run `adlint W0691.c` on noarch
79
+ Then the output should exactly match with:
80
+ | mesg | line | column |
81
+ | W0442 | 1 | 1 |
82
+ | W0691 | 3 | 21 |
83
+ | W0195 | 3 | 21 |
84
+ | W0117 | 3 | 8 |
85
+
86
+ Scenario: resulting an expression `1.2 * 3.4'
87
+ Given a target source named "W0691.c" with:
88
+ """
89
+ #define MACRO(a, b) a ## b
90
+
91
+ double d = (double) MACRO(1.2*, 3.4); /* W0691 */
92
+ """
93
+ When I successfully run `adlint W0691.c` on noarch
94
+ Then the output should exactly match with:
95
+ | mesg | line | column |
96
+ | W0442 | 1 | 1 |
97
+ | W0691 | 3 | 21 |
98
+ | W0117 | 3 | 8 |
99
+
100
+ # vim:ts=2:sw=2:sts=2:et: