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,118 @@
1
+ Feature: W0715
2
+
3
+ W0715 detects that operands of both sides of inclusive-or-expression is
4
+ `effectively boolean'.
5
+
6
+ Scenario: relational expressions
7
+ Given a target source named "W0715.c" with:
8
+ """
9
+ static int foo(int a, int b, int c, int d)
10
+ {
11
+ return (a > b) | (c > d); /* W0715 */
12
+ }
13
+ """
14
+ When I successfully run `adlint W0715.c` on noarch
15
+ Then the output should exactly match with:
16
+ | mesg | line | column |
17
+ | W1076 | 1 | 12 |
18
+ | W0572 | 3 | 20 |
19
+ | W0104 | 1 | 20 |
20
+ | W0104 | 1 | 27 |
21
+ | W0104 | 1 | 34 |
22
+ | W0104 | 1 | 41 |
23
+ | W0629 | 1 | 12 |
24
+ | W0715 | 3 | 20 |
25
+ | W0716 | 3 | 20 |
26
+ | W0628 | 1 | 12 |
27
+
28
+ Scenario: equality expressions
29
+ Given a target source named "W0715.c" with:
30
+ """
31
+ static int foo(int a, int b, int c, int d)
32
+ {
33
+ return (a == b) | (c != d); /* W0715 */
34
+ }
35
+ """
36
+ When I successfully run `adlint W0715.c` on noarch
37
+ Then the output should exactly match with:
38
+ | mesg | line | column |
39
+ | W1076 | 1 | 12 |
40
+ | W0572 | 3 | 21 |
41
+ | W0104 | 1 | 20 |
42
+ | W0104 | 1 | 27 |
43
+ | W0104 | 1 | 34 |
44
+ | W0104 | 1 | 41 |
45
+ | W0629 | 1 | 12 |
46
+ | W0715 | 3 | 21 |
47
+ | W0716 | 3 | 21 |
48
+ | W0628 | 1 | 12 |
49
+
50
+ Scenario: logical expressions
51
+ Given a target source named "W0715.c" with:
52
+ """
53
+ static int foo(int a, int b, int c, int d)
54
+ {
55
+ return (a && b) | (c || d); /* W0715 */
56
+ }
57
+ """
58
+ When I successfully run `adlint W0715.c` on noarch
59
+ Then the output should exactly match with:
60
+ | mesg | line | column |
61
+ | W1076 | 1 | 12 |
62
+ | W0572 | 3 | 21 |
63
+ | W0104 | 1 | 20 |
64
+ | W0104 | 1 | 27 |
65
+ | W0104 | 1 | 34 |
66
+ | W0104 | 1 | 41 |
67
+ | W0629 | 1 | 12 |
68
+ | W0715 | 3 | 21 |
69
+ | W0716 | 3 | 21 |
70
+ | W0628 | 1 | 12 |
71
+
72
+ Scenario: shift expressions
73
+ Given a target source named "W0715.c" with:
74
+ """
75
+ static int foo(int a, int b, int c, int d)
76
+ {
77
+ return (a << b) | (c ^ d); /* OK */
78
+ }
79
+ """
80
+ When I successfully run `adlint W0715.c` on noarch
81
+ Then the output should exactly match with:
82
+ | mesg | line | column |
83
+ | W1076 | 1 | 12 |
84
+ | W0570 | 3 | 15 |
85
+ | W0572 | 3 | 15 |
86
+ | W0794 | 3 | 15 |
87
+ | W0572 | 3 | 26 |
88
+ | W0572 | 3 | 21 |
89
+ | W0104 | 1 | 20 |
90
+ | W0104 | 1 | 27 |
91
+ | W0104 | 1 | 34 |
92
+ | W0104 | 1 | 41 |
93
+ | W0629 | 1 | 12 |
94
+ | W0628 | 1 | 12 |
95
+
96
+ Scenario: arithmetic expressions
97
+ Given a target source named "W0715.c" with:
98
+ """
99
+ static int foo(int a, int b, int c, int d)
100
+ {
101
+ return (a + b) | (c - d); /* OK */
102
+ }
103
+ """
104
+ When I successfully run `adlint W0715.c` on noarch
105
+ Then the output should exactly match with:
106
+ | mesg | line | column |
107
+ | W1076 | 1 | 12 |
108
+ | W0723 | 3 | 15 |
109
+ | W0723 | 3 | 25 |
110
+ | W0572 | 3 | 20 |
111
+ | W0104 | 1 | 20 |
112
+ | W0104 | 1 | 27 |
113
+ | W0104 | 1 | 34 |
114
+ | W0104 | 1 | 41 |
115
+ | W0629 | 1 | 12 |
116
+ | W0628 | 1 | 12 |
117
+
118
+ # vim:ts=2:sw=2:sts=2:et:
@@ -59,6 +59,7 @@ Feature: W0716
59
59
  | W1076 | 1 | 12 |
60
60
  | W0570 | 3 | 20 |
61
61
  | W0572 | 3 | 20 |
62
+ | W0794 | 3 | 20 |
62
63
  | W0104 | 1 | 20 |
63
64
  | W0104 | 1 | 27 |
64
65
  | W0104 | 1 | 34 |
@@ -57,6 +57,7 @@ Feature: W0717
57
57
  | W1076 | 1 | 12 |
58
58
  | W0570 | 3 | 20 |
59
59
  | W0572 | 3 | 20 |
60
+ | W0794 | 3 | 20 |
60
61
  | W0104 | 1 | 21 |
61
62
  | W0104 | 1 | 28 |
62
63
  | W0104 | 1 | 35 |
@@ -57,6 +57,7 @@ Feature: W0718
57
57
  | W1076 | 1 | 12 |
58
58
  | W0570 | 3 | 14 |
59
59
  | W0572 | 3 | 14 |
60
+ | W0794 | 3 | 14 |
60
61
  | W0104 | 1 | 21 |
61
62
  | W0104 | 1 | 28 |
62
63
  | W0104 | 1 | 35 |
@@ -0,0 +1,154 @@
1
+ Feature: W0719
2
+
3
+ W0719 detects that the right hand side of the shift-expression is greater
4
+ than the bit length of underlying type of the left hand side.
5
+
6
+ Scenario: 31-bit left shift-expression of `char' value
7
+ Given a target source named "W0719.c" with:
8
+ """
9
+ int foo(char c)
10
+ {
11
+ return c << 31; /* W0719 */
12
+ }
13
+ """
14
+ When I successfully run `adlint W0719.c` on noarch
15
+ Then the output should exactly match with:
16
+ | mesg | line | column |
17
+ | W0117 | 1 | 5 |
18
+ | W0123 | 3 | 12 |
19
+ | W0246 | 3 | 12 |
20
+ | W0116 | 3 | 14 |
21
+ | W0719 | 3 | 14 |
22
+ | W0104 | 1 | 14 |
23
+ | W0628 | 1 | 5 |
24
+
25
+ Scenario: 31-bit right shift-expression of `char' value
26
+ Given a target source named "W0719.c" with:
27
+ """
28
+ int foo(char c)
29
+ {
30
+ return c >> 31; /* W0719 */
31
+ }
32
+ """
33
+ When I successfully run `adlint W0719.c` on noarch
34
+ Then the output should exactly match with:
35
+ | mesg | line | column |
36
+ | W0117 | 1 | 5 |
37
+ | W0123 | 3 | 12 |
38
+ | W0246 | 3 | 12 |
39
+ | W0719 | 3 | 14 |
40
+ | W0104 | 1 | 14 |
41
+ | W0628 | 1 | 5 |
42
+
43
+ Scenario: 7-bit left shift-expression of `char' value
44
+ Given a target source named "W0719.c" with:
45
+ """
46
+ int foo(char c)
47
+ {
48
+ return c << 7; /* OK */
49
+ }
50
+ """
51
+ When I successfully run `adlint W0719.c` on noarch
52
+ Then the output should exactly match with:
53
+ | mesg | line | column |
54
+ | W0117 | 1 | 5 |
55
+ | W0123 | 3 | 12 |
56
+ | W0246 | 3 | 12 |
57
+ | W0116 | 3 | 14 |
58
+ | W0104 | 1 | 14 |
59
+ | W0628 | 1 | 5 |
60
+
61
+ Scenario: 7-bit right shift-expression of `char' value
62
+ Given a target source named "W0719.c" with:
63
+ """
64
+ int foo(char c)
65
+ {
66
+ return c >> 7; /* OK */
67
+ }
68
+ """
69
+ When I successfully run `adlint W0719.c` on noarch
70
+ Then the output should exactly match with:
71
+ | mesg | line | column |
72
+ | W0117 | 1 | 5 |
73
+ | W0123 | 3 | 12 |
74
+ | W0246 | 3 | 12 |
75
+ | W0104 | 1 | 14 |
76
+ | W0628 | 1 | 5 |
77
+
78
+ Scenario: 31-bit left shift compound-assignment-expression of `char' value
79
+ Given a target source named "W0719.c" with:
80
+ """
81
+ void foo(char c)
82
+ {
83
+ c <<= 31; /* W0719 */
84
+ }
85
+ """
86
+ When I successfully run `adlint W0719.c` on noarch
87
+ Then the output should exactly match with:
88
+ | mesg | line | column |
89
+ | W0117 | 1 | 6 |
90
+ | W0123 | 3 | 5 |
91
+ | W0246 | 3 | 5 |
92
+ | W0116 | 3 | 7 |
93
+ | W0719 | 3 | 7 |
94
+ | W0136 | 3 | 5 |
95
+ | W0165 | 3 | 5 |
96
+ | W0628 | 1 | 6 |
97
+
98
+ Scenario: 31-bit right shift-expression of `char' value
99
+ Given a target source named "W0719.c" with:
100
+ """
101
+ int foo(char c)
102
+ {
103
+ return c >> 31; /* W0719 */
104
+ }
105
+ """
106
+ When I successfully run `adlint W0719.c` on noarch
107
+ Then the output should exactly match with:
108
+ | mesg | line | column |
109
+ | W0117 | 1 | 5 |
110
+ | W0123 | 3 | 12 |
111
+ | W0246 | 3 | 12 |
112
+ | W0719 | 3 | 14 |
113
+ | W0104 | 1 | 14 |
114
+ | W0628 | 1 | 5 |
115
+
116
+ Scenario: 63-bit left shift compound-assignment-expression of `char' value
117
+ Given a target source named "W0719.c" with:
118
+ """
119
+ void foo(char c)
120
+ {
121
+ c <<= 63; /* OK but W0650 */
122
+ }
123
+ """
124
+ When I successfully run `adlint W0719.c` on noarch
125
+ Then the output should exactly match with:
126
+ | mesg | line | column |
127
+ | W0117 | 1 | 6 |
128
+ | W0123 | 3 | 5 |
129
+ | W0246 | 3 | 5 |
130
+ | W0116 | 3 | 7 |
131
+ | W0650 | 3 | 7 |
132
+ | W0136 | 3 | 5 |
133
+ | W0165 | 3 | 5 |
134
+ | W0628 | 1 | 6 |
135
+
136
+ Scenario: 63-bit right shift-expression of `char' value
137
+ Given a target source named "W0719.c" with:
138
+ """
139
+ int foo(char c)
140
+ {
141
+ return c >> 63; /* OK but W0650 */
142
+ }
143
+ """
144
+ When I successfully run `adlint W0719.c` on noarch
145
+ Then the output should exactly match with:
146
+ | mesg | line | column |
147
+ | W0117 | 1 | 5 |
148
+ | W0123 | 3 | 12 |
149
+ | W0246 | 3 | 12 |
150
+ | W0650 | 3 | 14 |
151
+ | W0104 | 1 | 14 |
152
+ | W0628 | 1 | 5 |
153
+
154
+ # vim:ts=2:sw=2:sts=2:et:
@@ -9,8 +9,7 @@ Feature: W0723
9
9
  static unsigned int j = (unsigned int) &i + 1; /* OK */
10
10
  """
11
11
  When I successfully run `adlint W0723.c` on noarch
12
- Then the output should not match with /2:.*:W0723/
13
- And the output should exactly match with:
12
+ Then the output should exactly match with:
14
13
  | mesg | line | column |
15
14
  | W0567 | 2 | 25 |
16
15
  | W0167 | 2 | 45 |
@@ -82,8 +82,10 @@ Feature: W0732
82
82
  | W1076 | 1 | 13 |
83
83
  | W0570 | 5 | 12 |
84
84
  | W0572 | 5 | 12 |
85
+ | W0794 | 5 | 12 |
85
86
  | W0570 | 5 | 24 |
86
87
  | W0572 | 5 | 24 |
88
+ | W0794 | 5 | 24 |
87
89
  | W0571 | 6 | 12 |
88
90
  | W0572 | 6 | 12 |
89
91
  | W0571 | 6 | 24 |
@@ -98,6 +100,7 @@ Feature: W0732
98
100
  | W0572 | 11 | 24 |
99
101
  | W0570 | 12 | 12 |
100
102
  | W0572 | 12 | 12 |
103
+ | W0794 | 12 | 12 |
101
104
  | W0571 | 12 | 25 |
102
105
  | W0572 | 12 | 25 |
103
106
  | W0104 | 1 | 29 |
@@ -82,8 +82,10 @@ Feature: W0733
82
82
  | W1076 | 1 | 13 |
83
83
  | W0570 | 5 | 12 |
84
84
  | W0572 | 5 | 12 |
85
+ | W0794 | 5 | 12 |
85
86
  | W0570 | 5 | 24 |
86
87
  | W0572 | 5 | 24 |
88
+ | W0794 | 5 | 24 |
87
89
  | W0571 | 6 | 12 |
88
90
  | W0572 | 6 | 12 |
89
91
  | W0571 | 6 | 24 |
@@ -98,6 +100,7 @@ Feature: W0733
98
100
  | W0572 | 11 | 24 |
99
101
  | W0570 | 12 | 12 |
100
102
  | W0572 | 12 | 12 |
103
+ | W0794 | 12 | 12 |
101
104
  | W0571 | 12 | 25 |
102
105
  | W0572 | 12 | 25 |
103
106
  | W0104 | 1 | 29 |
@@ -181,6 +181,7 @@ Feature: W0734
181
181
  | W1076 | 1 | 13 |
182
182
  | W0570 | 5 | 12 |
183
183
  | W0572 | 5 | 12 |
184
+ | W0794 | 5 | 12 |
184
185
  | W0571 | 6 | 12 |
185
186
  | W0572 | 6 | 12 |
186
187
  | W0572 | 7 | 12 |
@@ -222,6 +223,7 @@ Feature: W0734
222
223
  | W1076 | 1 | 13 |
223
224
  | W0570 | 5 | 12 |
224
225
  | W0572 | 5 | 12 |
226
+ | W0794 | 5 | 12 |
225
227
  | W0571 | 6 | 12 |
226
228
  | W0572 | 6 | 12 |
227
229
  | W0572 | 7 | 12 |
@@ -263,6 +265,7 @@ Feature: W0734
263
265
  | W1076 | 1 | 13 |
264
266
  | W0570 | 5 | 12 |
265
267
  | W0572 | 5 | 12 |
268
+ | W0794 | 5 | 12 |
266
269
  | W0571 | 6 | 12 |
267
270
  | W0572 | 6 | 12 |
268
271
  | W0572 | 7 | 12 |
@@ -305,6 +308,7 @@ Feature: W0734
305
308
  | W1076 | 1 | 13 |
306
309
  | W0570 | 5 | 12 |
307
310
  | W0572 | 5 | 12 |
311
+ | W0794 | 5 | 12 |
308
312
  | W0571 | 6 | 12 |
309
313
  | W0572 | 6 | 12 |
310
314
  | W0572 | 7 | 12 |
@@ -181,6 +181,7 @@ Feature: W0735
181
181
  | W1076 | 1 | 13 |
182
182
  | W0570 | 5 | 17 |
183
183
  | W0572 | 5 | 17 |
184
+ | W0794 | 5 | 17 |
184
185
  | W0571 | 6 | 17 |
185
186
  | W0572 | 6 | 17 |
186
187
  | W0572 | 7 | 17 |
@@ -222,6 +223,7 @@ Feature: W0735
222
223
  | W1076 | 1 | 13 |
223
224
  | W0570 | 5 | 17 |
224
225
  | W0572 | 5 | 17 |
226
+ | W0794 | 5 | 17 |
225
227
  | W0571 | 6 | 17 |
226
228
  | W0572 | 6 | 17 |
227
229
  | W0572 | 7 | 17 |
@@ -263,6 +265,7 @@ Feature: W0735
263
265
  | W1076 | 1 | 13 |
264
266
  | W0570 | 5 | 24 |
265
267
  | W0572 | 5 | 24 |
268
+ | W0794 | 5 | 24 |
266
269
  | W0571 | 6 | 23 |
267
270
  | W0572 | 6 | 23 |
268
271
  | W0572 | 7 | 24 |
@@ -305,6 +308,7 @@ Feature: W0735
305
308
  | W1076 | 1 | 13 |
306
309
  | W0570 | 5 | 24 |
307
310
  | W0572 | 5 | 24 |
311
+ | W0794 | 5 | 24 |
308
312
  | W0571 | 6 | 23 |
309
313
  | W0572 | 6 | 23 |
310
314
  | W0572 | 7 | 24 |
@@ -0,0 +1,132 @@
1
+ Feature: W0745
2
+
3
+ W0745 detects that an array subscript must cause out of bound access of the
4
+ array object.
5
+
6
+ Scenario: array-subscript-expression with non-constant subscript must cause
7
+ OOB access in an initializer
8
+ Given a target source named "W0745.c" with:
9
+ """
10
+ extern int a[5];
11
+
12
+ int foo(int i)
13
+ {
14
+ if (i < 0) {
15
+ int j = a[i - 1]; /* W0745 */
16
+ return j;
17
+ }
18
+ return i;
19
+ }
20
+ """
21
+ When I successfully run `adlint W0745.c` on noarch
22
+ Then the output should exactly match with:
23
+ | mesg | line | column |
24
+ | W0118 | 1 | 12 |
25
+ | W0117 | 3 | 5 |
26
+ | W0745 | 6 | 21 |
27
+ | W0100 | 6 | 13 |
28
+ | W0104 | 3 | 13 |
29
+ | W1071 | 3 | 5 |
30
+ | W0628 | 3 | 5 |
31
+
32
+ Scenario: array-subscript-expression with non-constant subscript must cause
33
+ OOB access in rhs operand of an assignment-expression
34
+ Given a target source named "W0745.c" with:
35
+ """
36
+ extern int a[5];
37
+
38
+ int foo(int i)
39
+ {
40
+ int j = 0;
41
+ if (i > 4) {
42
+ j = a[i + 1]; /* W0745 */
43
+ }
44
+ return j;
45
+ }
46
+ """
47
+ When I successfully run `adlint W0745.c` on noarch
48
+ Then the output should exactly match with:
49
+ | mesg | line | column |
50
+ | W0118 | 1 | 12 |
51
+ | W0117 | 3 | 5 |
52
+ | W0723 | 7 | 17 |
53
+ | W0745 | 7 | 17 |
54
+ | W0104 | 3 | 13 |
55
+ | W0628 | 3 | 5 |
56
+
57
+ Scenario: array-subscript-expression with non-constant subscript must cause
58
+ OOB access in lhs operand of an assignment-expression
59
+ Given a target source named "W0745.c" with:
60
+ """
61
+ extern int a[5];
62
+
63
+ void foo(int i)
64
+ {
65
+ if (i < -2) {
66
+ a[i + 2] = 0; /* W0745 */
67
+ }
68
+ }
69
+ """
70
+ When I successfully run `adlint W0745.c` on noarch
71
+ Then the output should exactly match with:
72
+ | mesg | line | column |
73
+ | W0118 | 1 | 12 |
74
+ | W0117 | 3 | 6 |
75
+ | W0745 | 6 | 13 |
76
+ | W0104 | 3 | 14 |
77
+ | W0628 | 3 | 6 |
78
+
79
+ Scenario: indirection-expression with non-constant subscript must cause OOB
80
+ access in rhs operand of an assignment-expression
81
+ Given a target source named "W0745.c" with:
82
+ """
83
+ extern int a[5];
84
+
85
+ int foo(int i)
86
+ {
87
+ int j = 0;
88
+ if (i > 5) {
89
+ j = *(a + i + 2); /* W0745 */
90
+ }
91
+ return j;
92
+ }
93
+ """
94
+ When I successfully run `adlint W0745.c` on noarch
95
+ Then the output should exactly match with:
96
+ | mesg | line | column |
97
+ | W0118 | 1 | 12 |
98
+ | W0117 | 3 | 5 |
99
+ | W9003 | 7 | 19 |
100
+ | W0023 | 7 | 17 |
101
+ | W9003 | 7 | 23 |
102
+ | W0023 | 7 | 21 |
103
+ | W0745 | 7 | 14 |
104
+ | W0104 | 3 | 13 |
105
+ | W0628 | 3 | 5 |
106
+
107
+ Scenario: indirection-expression with non-constant subscript must cause OOB
108
+ access in lhs operand of an assignment-expression
109
+ Given a target source named "W0745.c" with:
110
+ """
111
+ extern int a[5];
112
+
113
+ void foo(int i)
114
+ {
115
+ if (i < 0) {
116
+ *(i + a - 1) = 0; /* W0745 */
117
+ }
118
+ }
119
+ """
120
+ When I successfully run `adlint W0745.c` on noarch
121
+ Then the output should exactly match with:
122
+ | mesg | line | column |
123
+ | W0118 | 1 | 12 |
124
+ | W0117 | 3 | 6 |
125
+ | W9003 | 6 | 11 |
126
+ | W9003 | 6 | 19 |
127
+ | W0024 | 6 | 17 |
128
+ | W0745 | 6 | 10 |
129
+ | W0104 | 3 | 14 |
130
+ | W0628 | 3 | 6 |
131
+
132
+ # vim:ts=2:sw=2:sts=2:et: