adlint 1.16.0 → 1.18.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 (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
@@ -0,0 +1,68 @@
1
+ Feature: W0780
2
+
3
+ W0780 detects that a left shift-expression of unsigned constant value
4
+ discards upper non-zero bits.
5
+
6
+ Scenario: discarding 3 of zero bits and 1 of non-zero bit in `unsigned int'
7
+ constant
8
+ Given a target source named "W0719.c" with:
9
+ """
10
+ unsigned int foo(void)
11
+ {
12
+ return 0x08000000U << 5; /* W0780 */
13
+ }
14
+ """
15
+ When I successfully run `adlint W0719.c` on noarch
16
+ Then the output should exactly match with:
17
+ | mesg | line | column |
18
+ | W0117 | 1 | 14 |
19
+ | W0115 | 3 | 24 |
20
+ | W0780 | 3 | 24 |
21
+ | W0628 | 1 | 14 |
22
+
23
+ Scenario: discarding 4 of zero bits in `unsigned int' constant
24
+ Given a target source named "W0719.c" with:
25
+ """
26
+ unsigned int foo(void)
27
+ {
28
+ return 0x08000000U << 4; /* OK */
29
+ }
30
+ """
31
+ When I successfully run `adlint W0719.c` on noarch
32
+ Then the output should exactly match with:
33
+ | mesg | line | column |
34
+ | W0117 | 1 | 14 |
35
+ | W0628 | 1 | 14 |
36
+
37
+ Scenario: discarding 3 of zero bits and 1 of non-zero bit in `unsigned long'
38
+ constant
39
+ Given a target source named "W0719.c" with:
40
+ """
41
+ unsigned long foo(void)
42
+ {
43
+ return 0x08000000UL << 5; /* W0780 */
44
+ }
45
+ """
46
+ When I successfully run `adlint W0719.c` on noarch
47
+ Then the output should exactly match with:
48
+ | mesg | line | column |
49
+ | W0117 | 1 | 15 |
50
+ | W0115 | 3 | 25 |
51
+ | W0780 | 3 | 25 |
52
+ | W0628 | 1 | 15 |
53
+
54
+ Scenario: discarding 4 of zero bits in `unsigned int' constant
55
+ Given a target source named "W0719.c" with:
56
+ """
57
+ unsigned long foo(void)
58
+ {
59
+ return 0x08000000UL << 4; /* OK */
60
+ }
61
+ """
62
+ When I successfully run `adlint W0719.c` on noarch
63
+ Then the output should exactly match with:
64
+ | mesg | line | column |
65
+ | W0117 | 1 | 15 |
66
+ | W0628 | 1 | 15 |
67
+
68
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,95 @@
1
+ Feature: W0783
2
+
3
+ W0783 detects that a cast-expression contains a pointer type of an incomplete
4
+ type.
5
+
6
+ Scenario: casting to a pointer of an incomplete struct
7
+ Given a target source named "W0783.c" with:
8
+ """
9
+ extern struct Foo *gp;
10
+
11
+ void foo(int *p)
12
+ {
13
+ gp = (struct Foo *) p; /* W0783 */
14
+ }
15
+ """
16
+ When I successfully run `adlint W0783.c` on noarch
17
+ Then the output should exactly match with:
18
+ | mesg | line | column |
19
+ | W0118 | 1 | 20 |
20
+ | W0117 | 3 | 6 |
21
+ | W0783 | 5 | 10 |
22
+ | W0104 | 3 | 15 |
23
+ | W0105 | 3 | 15 |
24
+ | W0628 | 3 | 6 |
25
+
26
+ Scenario: casting from a pointer of an incomplete struct
27
+ Given a target source named "W0783.c" with:
28
+ """
29
+ extern struct Foo *gp;
30
+
31
+ void foo(void)
32
+ {
33
+ int *p = (int *) gp; /* W0783 */
34
+ }
35
+ """
36
+ When I successfully run `adlint W0783.c` on noarch
37
+ Then the output should exactly match with:
38
+ | mesg | line | column |
39
+ | W0118 | 1 | 20 |
40
+ | W0117 | 3 | 6 |
41
+ | W0783 | 5 | 14 |
42
+ | W0100 | 5 | 10 |
43
+ | W0628 | 3 | 6 |
44
+
45
+ Scenario: casting from and to a pointer of an incomplete struct
46
+ Given a target source named "W0783.c" with:
47
+ """
48
+ extern struct Foo *p1;
49
+ extern union Bar *p2;
50
+
51
+ void foo(void)
52
+ {
53
+ p2 = (union Bar *) p1; /* W0783 */
54
+ }
55
+ """
56
+ When I successfully run `adlint W0783.c` on noarch
57
+ Then the output should exactly match with:
58
+ | mesg | line | column |
59
+ | W0118 | 1 | 20 |
60
+ | W0118 | 2 | 19 |
61
+ | W0117 | 4 | 6 |
62
+ | W0783 | 6 | 10 |
63
+ | W0628 | 4 | 6 |
64
+
65
+ Scenario: casting from and to a pointer of an complete type
66
+ Given a target source named "W0783.c" with:
67
+ """
68
+ struct Foo {
69
+ int i;
70
+ } *p1;
71
+
72
+ union Bar {
73
+ int i;
74
+ char c;
75
+ } *p2;
76
+
77
+ void foo(void)
78
+ {
79
+ p2 = (union Bar *) p1; /* OK */
80
+ }
81
+ """
82
+ When I successfully run `adlint W0783.c` on noarch
83
+ Then the output should exactly match with:
84
+ | mesg | line | column |
85
+ | W0117 | 3 | 4 |
86
+ | W0117 | 8 | 4 |
87
+ | W0117 | 10 | 6 |
88
+ | W0551 | 5 | 7 |
89
+ | W0628 | 10 | 6 |
90
+ | W0589 | 3 | 4 |
91
+ | W0593 | 3 | 4 |
92
+ | W0589 | 8 | 4 |
93
+ | W0593 | 8 | 4 |
94
+
95
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,124 @@
1
+ Feature: W0792
2
+
3
+ W0792 detects that an explicit conversion between variable of floating point
4
+ number and pointer to a function is found.
5
+
6
+ Scenario: converting `float' to function pointer
7
+ Given a target source named "W0792.c" with:
8
+ """
9
+ int (*foo(const float f))(void)
10
+ {
11
+ return (int (*)(void)) f; /* W0792 */
12
+ }
13
+ """
14
+ When I successfully run `adlint W0792.c` on noarch
15
+ Then the output should exactly match with:
16
+ | mesg | line | column |
17
+ | W0117 | 1 | 7 |
18
+ | W0792 | 3 | 12 |
19
+ | W0628 | 1 | 7 |
20
+
21
+ Scenario: converting `double' to function pointer
22
+ Given a target source named "W0792.c" with:
23
+ """
24
+ int (*foo(const double f))(void)
25
+ {
26
+ return (int (*)(void)) f; /* W0792 */
27
+ }
28
+ """
29
+ When I successfully run `adlint W0792.c` on noarch
30
+ Then the output should exactly match with:
31
+ | mesg | line | column |
32
+ | W0117 | 1 | 7 |
33
+ | W0792 | 3 | 12 |
34
+ | W0628 | 1 | 7 |
35
+
36
+ Scenario: converting `long double' to function pointer
37
+ Given a target source named "W0792.c" with:
38
+ """
39
+ int (*foo(const long double f))(void)
40
+ {
41
+ return (int (*)(void)) f; /* W0792 */
42
+ }
43
+ """
44
+ When I successfully run `adlint W0792.c` on noarch
45
+ Then the output should exactly match with:
46
+ | mesg | line | column |
47
+ | W0117 | 1 | 7 |
48
+ | W0792 | 3 | 12 |
49
+ | W0628 | 1 | 7 |
50
+
51
+ Scenario: converting function pointer to `float'
52
+ Given a target source named "W0792.c" with:
53
+ """
54
+ float foo(int (* const p)(void))
55
+ {
56
+ return (float) p; /* W0792 */
57
+ }
58
+ """
59
+ When I successfully run `adlint W0792.c` on noarch
60
+ Then the output should exactly match with:
61
+ | mesg | line | column |
62
+ | W0117 | 1 | 7 |
63
+ | W0792 | 3 | 12 |
64
+ | W0628 | 1 | 7 |
65
+
66
+ Scenario: converting function pointer to `double'
67
+ Given a target source named "W0792.c" with:
68
+ """
69
+ double foo(int (* const p)(void))
70
+ {
71
+ return (double) p; /* W0792 */
72
+ }
73
+ """
74
+ When I successfully run `adlint W0792.c` on noarch
75
+ Then the output should exactly match with:
76
+ | mesg | line | column |
77
+ | W0117 | 1 | 8 |
78
+ | W0792 | 3 | 12 |
79
+ | W0628 | 1 | 8 |
80
+
81
+ Scenario: converting function pointer to `long double'
82
+ Given a target source named "W0792.c" with:
83
+ """
84
+ long double foo(int (* const p)(void))
85
+ {
86
+ return (long double) p; /* W0792 */
87
+ }
88
+ """
89
+ When I successfully run `adlint W0792.c` on noarch
90
+ Then the output should exactly match with:
91
+ | mesg | line | column |
92
+ | W0117 | 1 | 13 |
93
+ | W0792 | 3 | 12 |
94
+ | W0628 | 1 | 13 |
95
+
96
+ Scenario: converting `float' to `int'
97
+ Given a target source named "W0792.c" with:
98
+ """
99
+ int foo(const float f)
100
+ {
101
+ return (int) f; /* OK */
102
+ }
103
+ """
104
+ When I successfully run `adlint W0792.c` on noarch
105
+ Then the output should exactly match with:
106
+ | mesg | line | column |
107
+ | W0117 | 1 | 5 |
108
+ | W0628 | 1 | 5 |
109
+
110
+ Scenario: converting function pointer to `void *'
111
+ Given a target source named "W0792.c" with:
112
+ """
113
+ void *foo(int (* const p)(void))
114
+ {
115
+ return (void *) p; /* OK */
116
+ }
117
+ """
118
+ When I successfully run `adlint W0792.c` on noarch
119
+ Then the output should exactly match with:
120
+ | mesg | line | column |
121
+ | W0117 | 1 | 7 |
122
+ | W0628 | 1 | 7 |
123
+
124
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,153 @@
1
+ Feature: W0793
2
+
3
+ W0793 detects that an explicit conversion between pointer to variable and
4
+ pointer to function is found.
5
+
6
+ Scenario: converting `float *' to function pointer
7
+ Given a target source named "W0793.c" with:
8
+ """
9
+ typedef int (*funptr_t)(void);
10
+
11
+ funptr_t foo(float *p)
12
+ {
13
+ return (funptr_t) p; /* W0793 */
14
+ }
15
+ """
16
+ When I successfully run `adlint W0793.c` on noarch
17
+ Then the output should exactly match with:
18
+ | mesg | line | column |
19
+ | W0117 | 3 | 10 |
20
+ | W0625 | 1 | 15 |
21
+ | W0793 | 5 | 12 |
22
+ | W0104 | 3 | 21 |
23
+ | W0105 | 3 | 21 |
24
+ | W0628 | 3 | 10 |
25
+
26
+ Scenario: converting `double *' to function pointer
27
+ Given a target source named "W0793.c" with:
28
+ """
29
+ typedef int (*funptr_t)(void);
30
+
31
+ funptr_t foo(double *p)
32
+ {
33
+ return (funptr_t) p; /* W0793 */
34
+ }
35
+ """
36
+ When I successfully run `adlint W0793.c` on noarch
37
+ Then the output should exactly match with:
38
+ | mesg | line | column |
39
+ | W0117 | 3 | 10 |
40
+ | W0625 | 1 | 15 |
41
+ | W0793 | 5 | 12 |
42
+ | W0104 | 3 | 22 |
43
+ | W0105 | 3 | 22 |
44
+ | W0628 | 3 | 10 |
45
+
46
+ Scenario: converting `long double *' to function pointer
47
+ Given a target source named "W0793.c" with:
48
+ """
49
+ typedef int (*funptr_t)(void);
50
+
51
+ funptr_t foo(long double *p)
52
+ {
53
+ return (funptr_t) p; /* W0793 */
54
+ }
55
+ """
56
+ When I successfully run `adlint W0793.c` on noarch
57
+ Then the output should exactly match with:
58
+ | mesg | line | column |
59
+ | W0117 | 3 | 10 |
60
+ | W0625 | 1 | 15 |
61
+ | W0793 | 5 | 12 |
62
+ | W0104 | 3 | 27 |
63
+ | W0105 | 3 | 27 |
64
+ | W0628 | 3 | 10 |
65
+
66
+ Scenario: converting function pointer to `float *'
67
+ Given a target source named "W0793.c" with:
68
+ """
69
+ typedef int (*funptr_t)(void);
70
+
71
+ float *foo(funptr_t p)
72
+ {
73
+ return (float *) p; /* W0793 */
74
+ }
75
+ """
76
+ When I successfully run `adlint W0793.c` on noarch
77
+ Then the output should exactly match with:
78
+ | mesg | line | column |
79
+ | W0117 | 3 | 8 |
80
+ | W0793 | 5 | 12 |
81
+ | W0104 | 3 | 21 |
82
+ | W0628 | 3 | 8 |
83
+
84
+ Scenario: converting function pointer to `double *'
85
+ Given a target source named "W0793.c" with:
86
+ """
87
+ typedef int (*funptr_t)(void);
88
+
89
+ double *foo(funptr_t p)
90
+ {
91
+ return (double *) p; /* W0793 */
92
+ }
93
+ """
94
+ When I successfully run `adlint W0793.c` on noarch
95
+ Then the output should exactly match with:
96
+ | mesg | line | column |
97
+ | W0117 | 3 | 9 |
98
+ | W0793 | 5 | 12 |
99
+ | W0104 | 3 | 22 |
100
+ | W0628 | 3 | 9 |
101
+
102
+ Scenario: converting function pointer to `long double *'
103
+ Given a target source named "W0793.c" with:
104
+ """
105
+ typedef int (*funptr_t)(void);
106
+
107
+ long double *foo(funptr_t p)
108
+ {
109
+ return (long double *) p; /* W0793 */
110
+ }
111
+ """
112
+ When I successfully run `adlint W0793.c` on noarch
113
+ Then the output should exactly match with:
114
+ | mesg | line | column |
115
+ | W0117 | 3 | 14 |
116
+ | W0793 | 5 | 12 |
117
+ | W0104 | 3 | 27 |
118
+ | W0628 | 3 | 14 |
119
+
120
+ Scenario: converting `float *' to `int *'
121
+ Given a target source named "W0793.c" with:
122
+ """
123
+ int *foo(float *p)
124
+ {
125
+ return (int *) p; /* OK */
126
+ }
127
+ """
128
+ When I successfully run `adlint W0793.c` on noarch
129
+ Then the output should exactly match with:
130
+ | mesg | line | column |
131
+ | W0117 | 1 | 6 |
132
+ | W0104 | 1 | 17 |
133
+ | W0105 | 1 | 17 |
134
+ | W0628 | 1 | 6 |
135
+
136
+ Scenario: converting function pointer to `void *'
137
+ Given a target source named "W0793.c" with:
138
+ """
139
+ typedef int (*funptr_t)(void);
140
+
141
+ void *foo(funptr_t p)
142
+ {
143
+ return (void *) p; /* OK */
144
+ }
145
+ """
146
+ When I successfully run `adlint W0793.c` on noarch
147
+ Then the output should exactly match with:
148
+ | mesg | line | column |
149
+ | W0117 | 3 | 7 |
150
+ | W0104 | 3 | 20 |
151
+ | W0628 | 3 | 7 |
152
+
153
+ # vim:ts=2:sw=2:sts=2:et:
@@ -0,0 +1,90 @@
1
+ Feature: W0794
2
+
3
+ W0794 detects that a value of the signed integer variable is shifted to left.
4
+
5
+ Scenario: left shifting a `signed int' value
6
+ Given a target source named "W0794.c" with:
7
+ """
8
+ int func(int i)
9
+ {
10
+ return i << 1; /* W0794 */
11
+ }
12
+ """
13
+ When I successfully run `adlint W0794.c` on noarch
14
+ Then the output should exactly match with:
15
+ | mesg | line | column |
16
+ | W0117 | 1 | 5 |
17
+ | W0570 | 3 | 14 |
18
+ | W0572 | 3 | 14 |
19
+ | W0794 | 3 | 14 |
20
+ | W0104 | 1 | 14 |
21
+ | W0628 | 1 | 5 |
22
+
23
+ Scenario: right shifting a `signed int' value
24
+ Given a target source named "W0794.c" with:
25
+ """
26
+ int func(int i)
27
+ {
28
+ return i >> 1; /* OK */
29
+ }
30
+ """
31
+ When I successfully run `adlint W0794.c` on noarch
32
+ Then the output should exactly match with:
33
+ | mesg | line | column |
34
+ | W0117 | 1 | 5 |
35
+ | W0571 | 3 | 14 |
36
+ | W0572 | 3 | 14 |
37
+ | W0104 | 1 | 14 |
38
+ | W0628 | 1 | 5 |
39
+
40
+ Scenario: left shifting an `unsigned int' value
41
+ Given a target source named "W0794.c" with:
42
+ """
43
+ unsigned int func(unsigned int ui)
44
+ {
45
+ return ui << 1; /* OK */
46
+ }
47
+ """
48
+ When I successfully run `adlint W0794.c` on noarch
49
+ Then the output should exactly match with:
50
+ | mesg | line | column |
51
+ | W0117 | 1 | 14 |
52
+ | W0116 | 3 | 15 |
53
+ | W0104 | 1 | 32 |
54
+ | W0628 | 1 | 14 |
55
+
56
+ Scenario: left shifting a `signed int' constant
57
+ Given a target source named "W0794.c" with:
58
+ """
59
+ int func(void)
60
+ {
61
+ return 123 << 1; /* OK */
62
+ }
63
+ """
64
+ When I successfully run `adlint W0794.c` on noarch
65
+ Then the output should exactly match with:
66
+ | mesg | line | column |
67
+ | W0117 | 1 | 5 |
68
+ | W0572 | 3 | 16 |
69
+ | W0628 | 1 | 5 |
70
+
71
+ Scenario: left shifting an `unsigned char' value which will be
72
+ integer-promoted to `signed int'
73
+ Given a target source named "W0794.c" with:
74
+ """
75
+ int func(unsigned char uc)
76
+ {
77
+ return uc << 1; /* OK */
78
+ }
79
+ """
80
+ When I successfully run `adlint W0794.c` on noarch
81
+ Then the output should exactly match with:
82
+ | mesg | line | column |
83
+ | W0117 | 1 | 5 |
84
+ | W0123 | 3 | 12 |
85
+ | W0246 | 3 | 12 |
86
+ | W0116 | 3 | 15 |
87
+ | W0104 | 1 | 24 |
88
+ | W0628 | 1 | 5 |
89
+
90
+ # vim:ts=2:sw=2:sts=2:et: