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
@@ -24,6 +24,7 @@ Feature: W1072
24
24
  When I successfully run `adlint W1072.c` on noarch
25
25
  Then the output should exactly match with:
26
26
  | mesg | line | column |
27
+ | W1076 | 1 | 12 |
27
28
  | W0629 | 1 | 12 |
28
29
  | W1072 | 4 | 9 |
29
30
  | W1072 | 7 | 5 |
@@ -0,0 +1,145 @@
1
+ Feature: W1073
2
+
3
+ W1073 detects that a return value of the function is discarded.
4
+
5
+ Scenario: simply discarding a return value
6
+ Given a target source named "W1073.c" with:
7
+ """
8
+ extern int bar(void);
9
+ static void foo(void)
10
+ {
11
+ bar(); /* W1073 */
12
+ }
13
+ """
14
+ When I successfully run `adlint W1073.c` on noarch
15
+ Then the output should exactly match with:
16
+ | mesg | line | column |
17
+ | W0118 | 1 | 12 |
18
+ | W1076 | 2 | 13 |
19
+ | W1073 | 4 | 8 |
20
+ | W0629 | 2 | 13 |
21
+ | W0628 | 2 | 13 |
22
+
23
+ Scenario: calling `void' function
24
+ Given a target source named "W1073.c" with:
25
+ """
26
+ extern void bar(void);
27
+ static void foo(void)
28
+ {
29
+ bar(); /* OK */
30
+ }
31
+ """
32
+ When I successfully run `adlint W1073.c` on noarch
33
+ Then the output should exactly match with:
34
+ | mesg | line | column |
35
+ | W0118 | 1 | 13 |
36
+ | W1076 | 2 | 13 |
37
+ | W0629 | 2 | 13 |
38
+ | W0628 | 2 | 13 |
39
+
40
+ Scenario: discarding return value in comma separated expression
41
+ Given a target source named "W1073.c" with:
42
+ """
43
+ extern int bar(void);
44
+ extern void baz(void);
45
+ static void foo(void)
46
+ {
47
+ int i;
48
+ i = (bar(), baz()); /* W1073 */
49
+ }
50
+ """
51
+ When I successfully run `adlint W1073.c` on noarch
52
+ Then the output should exactly match with:
53
+ | mesg | line | column |
54
+ | W0118 | 1 | 12 |
55
+ | W0118 | 2 | 13 |
56
+ | W1076 | 3 | 13 |
57
+ | W0100 | 5 | 9 |
58
+ | W1073 | 6 | 13 |
59
+ | W0629 | 3 | 13 |
60
+ | W0447 | 6 | 10 |
61
+ | W0628 | 3 | 13 |
62
+
63
+ Scenario: discarding return value in for-statement
64
+ Given a target source named "W1073.c" with:
65
+ """
66
+ extern int bar(void);
67
+ static void foo(void)
68
+ {
69
+ int i;
70
+ int j;
71
+ for (i = 0, bar(); i < 10; i++) { /* W1073 */
72
+ j = bar(); /* OK */
73
+ }
74
+ }
75
+ """
76
+ When I successfully run `adlint W1073.c` on noarch
77
+ Then the output should exactly match with:
78
+ | mesg | line | column |
79
+ | W0118 | 1 | 12 |
80
+ | W1076 | 2 | 13 |
81
+ | W0100 | 5 | 9 |
82
+ | W1073 | 6 | 20 |
83
+ | W0629 | 2 | 13 |
84
+ | W0535 | 6 | 10 |
85
+ | W0628 | 2 | 13 |
86
+
87
+ Scenario: no assignment but not discarding the return value
88
+ Given a target source named "W1073.c" with:
89
+ """
90
+ extern int bar(void);
91
+ static void foo(void)
92
+ {
93
+ if (bar() == 0) { /* OK */
94
+ return;
95
+ }
96
+ }
97
+ """
98
+ When I successfully run `adlint W1073.c` on noarch
99
+ Then the output should exactly match with:
100
+ | mesg | line | column |
101
+ | W0118 | 1 | 12 |
102
+ | W1076 | 2 | 13 |
103
+ | W0629 | 2 | 13 |
104
+ | W0628 | 2 | 13 |
105
+
106
+ Scenario: propagating the return value
107
+ Given a target source named "W1073.c" with:
108
+ """
109
+ extern int bar(void);
110
+ static int foo(void)
111
+ {
112
+ return bar(); /* OK */
113
+ }
114
+ """
115
+ When I successfully run `adlint W1073.c` on noarch
116
+ Then the output should exactly match with:
117
+ | mesg | line | column |
118
+ | W0118 | 1 | 12 |
119
+ | W1076 | 2 | 12 |
120
+ | W0629 | 2 | 12 |
121
+ | W0628 | 2 | 12 |
122
+
123
+ Scenario: propagating the return value in a conditional-expression
124
+ Given a target source named "W1073.c" with:
125
+ """
126
+ extern int bar(void);
127
+ extern int baz(void);
128
+ static int foo(void)
129
+ {
130
+ return bar() == 0 ? baz() : 0; /* OK */
131
+ }
132
+ """
133
+ When I successfully run `adlint W1073.c` on noarch
134
+ Then the output should exactly match with:
135
+ | mesg | line | column |
136
+ | W0118 | 1 | 12 |
137
+ | W0118 | 2 | 12 |
138
+ | W1076 | 3 | 12 |
139
+ | W0629 | 3 | 12 |
140
+ | W0501 | 5 | 12 |
141
+ | W0010 | 5 | 23 |
142
+ | W0086 | 5 | 23 |
143
+ | W0628 | 3 | 12 |
144
+
145
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,139 @@
1
+ Feature: W1074
2
+
3
+ W1074 detects that an expression with possible side-effects appears in the
4
+ `sizeof' expression.
5
+
6
+ Scenario: postfix-increment-expression in the sizeof-expression
7
+ Given a target source named "W1074.c" with:
8
+ """
9
+ static int foo(void)
10
+ {
11
+ int i = 0;
12
+
13
+ if (sizeof(i++) == 4) { /* W1074 */
14
+ return 0;
15
+ }
16
+ else {
17
+ return 1;
18
+ }
19
+ }
20
+ """
21
+ When I successfully run `adlint W1074.c` on noarch
22
+ Then the output should exactly match with:
23
+ | mesg | line | column |
24
+ | W1076 | 1 | 12 |
25
+ | W0612 | 5 | 21 |
26
+ | W0609 | 5 | 21 |
27
+ | W0629 | 1 | 12 |
28
+ | W1074 | 5 | 15 |
29
+ | W9001 | 9 | 9 |
30
+ | W0628 | 1 | 12 |
31
+
32
+ Scenario: nested sizeof-expression
33
+ Given a target source named "W1074.c" with:
34
+ """
35
+ static int foo(void)
36
+ {
37
+ int i = 0;
38
+
39
+ if (sizeof(1 + sizeof(i++)) == 5) { /* W1074 */
40
+ return 0;
41
+ }
42
+ else {
43
+ return 1;
44
+ }
45
+ }
46
+ """
47
+ When I successfully run `adlint W1074.c` on noarch
48
+ Then the output should exactly match with:
49
+ | mesg | line | column |
50
+ | W1076 | 1 | 12 |
51
+ | W0613 | 5 | 33 |
52
+ | W0610 | 5 | 33 |
53
+ | W0629 | 1 | 12 |
54
+ | W1074 | 5 | 26 |
55
+ | W9001 | 6 | 9 |
56
+ | W0628 | 1 | 12 |
57
+
58
+ Scenario: ungrouped postfix-increment-expression in the sizeof-expression
59
+ Given a target source named "W1074.c" with:
60
+ """
61
+ static int foo(void)
62
+ {
63
+ int i = 0;
64
+
65
+ if (sizeof i++ == 4) { /* W1074 */
66
+ return 0;
67
+ }
68
+ else {
69
+ return 1;
70
+ }
71
+ }
72
+ """
73
+ When I successfully run `adlint W1074.c` on noarch
74
+ Then the output should exactly match with:
75
+ | mesg | line | column |
76
+ | W1076 | 1 | 12 |
77
+ | W0612 | 5 | 20 |
78
+ | W0609 | 5 | 20 |
79
+ | W0629 | 1 | 12 |
80
+ | W1074 | 5 | 17 |
81
+ | W9001 | 9 | 9 |
82
+ | W0628 | 1 | 12 |
83
+
84
+ Scenario: function-call-expression in the sizeof-expression
85
+ Given a target source named "W1074.c" with:
86
+ """
87
+ extern int bar(void);
88
+
89
+ static int foo(void)
90
+ {
91
+ if (sizeof(bar()) == 4) { /* W1074 */
92
+ return 0;
93
+ }
94
+ else {
95
+ return 1;
96
+ }
97
+ }
98
+ """
99
+ When I successfully run `adlint W1074.c` on noarch
100
+ Then the output should exactly match with:
101
+ | mesg | line | column |
102
+ | W0118 | 1 | 12 |
103
+ | W1076 | 3 | 12 |
104
+ | W0612 | 5 | 23 |
105
+ | W0609 | 5 | 23 |
106
+ | W1073 | 5 | 19 |
107
+ | W0629 | 3 | 12 |
108
+ | W1074 | 5 | 15 |
109
+ | W9001 | 9 | 9 |
110
+ | W0628 | 3 | 12 |
111
+
112
+ Scenario: array-subscript-expression in the sizeof-expression
113
+ Given a target source named "W1074.c" with:
114
+ """
115
+ extern int a[];
116
+
117
+ static int foo(void)
118
+ {
119
+ if (sizeof(a[0]) == 4) { /* OK */
120
+ return 0;
121
+ }
122
+ else {
123
+ return 1;
124
+ }
125
+ }
126
+ """
127
+ When I successfully run `adlint W1074.c` on noarch
128
+ Then the output should exactly match with:
129
+ | mesg | line | column |
130
+ | W0118 | 1 | 12 |
131
+ | W1077 | 1 | 12 |
132
+ | W1076 | 3 | 12 |
133
+ | W0612 | 5 | 22 |
134
+ | W0609 | 5 | 22 |
135
+ | W0629 | 3 | 12 |
136
+ | W9001 | 9 | 9 |
137
+ | W0628 | 3 | 12 |
138
+
139
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,86 @@
1
+ Feature: W1075
2
+
3
+ W1075 detects that a declaration has no `static' specifier while the anterior
4
+ declaration is specified as `static'.
5
+
6
+ Scenario: colliding global variable declarations
7
+ Given a target source named "W1075.c" with:
8
+ """
9
+ static int i;
10
+ extern int i; /* W1075 */
11
+ """
12
+ When I successfully run `adlint W1075.c` on noarch
13
+ Then the output should exactly match with:
14
+ | mesg | line | column |
15
+ | W1031 | 2 | 12 |
16
+ | W1075 | 2 | 12 |
17
+
18
+ Scenario: `static' function declaration followed by its definition without
19
+ storage-class-specifier
20
+ Given a target source named "W1075.c" with:
21
+ """
22
+ static int foo(void);
23
+
24
+ int foo(void) /* W1075 */
25
+ {
26
+ return 0;
27
+ }
28
+ """
29
+ When I successfully run `adlint W1075.c` on noarch
30
+ Then the output should exactly match with:
31
+ | mesg | line | column |
32
+ | W1075 | 3 | 5 |
33
+ | W0629 | 3 | 5 |
34
+ | W0628 | 3 | 5 |
35
+
36
+ Scenario: colliding function declarations with `static' and `extern'
37
+ Given a target source named "W1075.c" with:
38
+ """
39
+ static int foo(void);
40
+
41
+ extern int foo(void) /* W1075 */
42
+ {
43
+ return 0;
44
+ }
45
+ """
46
+ When I successfully run `adlint W1075.c` on noarch
47
+ Then the output should exactly match with:
48
+ | mesg | line | column |
49
+ | W1031 | 3 | 12 |
50
+ | W1075 | 3 | 12 |
51
+ | W0629 | 3 | 12 |
52
+ | W0628 | 3 | 12 |
53
+
54
+ Scenario: all function declarations with `static'
55
+ Given a target source named "W1075.c" with:
56
+ """
57
+ static int foo(void);
58
+
59
+ static int foo(void) /* OK */
60
+ {
61
+ return 0;
62
+ }
63
+ """
64
+ When I successfully run `adlint W1075.c` on noarch
65
+ Then the output should exactly match with:
66
+ | mesg | line | column |
67
+ | W0629 | 3 | 12 |
68
+ | W0628 | 3 | 12 |
69
+
70
+ Scenario: all function declarations with `extern'
71
+ Given a target source named "W1075.c" with:
72
+ """
73
+ extern int foo(void);
74
+
75
+ extern int foo(void) /* OK */
76
+ {
77
+ return 0;
78
+ }
79
+ """
80
+ When I successfully run `adlint W1075.c` on noarch
81
+ Then the output should exactly match with:
82
+ | mesg | line | column |
83
+ | W0118 | 1 | 12 |
84
+ | W0628 | 3 | 12 |
85
+
86
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,66 @@
1
+ Feature: W1076
2
+
3
+ W1076 detects that a `static' function definition appears with no anterior
4
+ function declarations.
5
+
6
+ Scenario: `static' function definition
7
+ Given a target source named "W1076.c" with:
8
+ """
9
+ static int foo(void) /* W1076 */
10
+ {
11
+ return 0;
12
+ }
13
+ """
14
+ When I successfully run `adlint W1076.c` on noarch
15
+ Then the output should exactly match with:
16
+ | mesg | line | column |
17
+ | W1076 | 1 | 12 |
18
+ | W0629 | 1 | 12 |
19
+ | W0628 | 1 | 12 |
20
+
21
+ Scenario: `static' function declaration followed by the `static' function
22
+ definition
23
+ Given a target source named "W1076.c" with:
24
+ """
25
+ static int foo(void);
26
+
27
+ static int foo(void) /* OK */
28
+ {
29
+ return 0;
30
+ }
31
+ """
32
+ When I successfully run `adlint W1076.c` on noarch
33
+ Then the output should exactly match with:
34
+ | mesg | line | column |
35
+ | W0629 | 3 | 12 |
36
+ | W0628 | 3 | 12 |
37
+
38
+ Scenario: `extern' function definition
39
+ Given a target source named "W1076.c" with:
40
+ """
41
+ extern int foo(void) /* OK */
42
+ {
43
+ return 0;
44
+ }
45
+ """
46
+ When I successfully run `adlint W1076.c` on noarch
47
+ Then the output should exactly match with:
48
+ | mesg | line | column |
49
+ | W0117 | 1 | 12 |
50
+ | W0628 | 1 | 12 |
51
+
52
+ Scenario: function definition without storage-class-specifier
53
+ Given a target source named "W1076.c" with:
54
+ """
55
+ int foo(void) /* OK */
56
+ {
57
+ return 0;
58
+ }
59
+ """
60
+ When I successfully run `adlint W1076.c` on noarch
61
+ Then the output should exactly match with:
62
+ | mesg | line | column |
63
+ | W0117 | 1 | 5 |
64
+ | W0628 | 1 | 5 |
65
+
66
+ # vim:ts=2:sw=2:sts=2:et: