adlint 3.0.10 → 3.2.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 (137) hide show
  1. data/ChangeLog +67 -0
  2. data/MANIFEST +2 -0
  3. data/NEWS +10 -3
  4. data/etc/mesg.d/c_builtin/en_US/messages.yml +29 -1
  5. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +29 -1
  6. data/etc/mesg.d/core/en_US/messages.yml +1 -1
  7. data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
  8. data/features/code_check/W0003.feature +5 -0
  9. data/features/code_check/W0023.feature +32 -0
  10. data/features/code_check/W0024.feature +22 -0
  11. data/features/code_check/W0093.feature +71 -0
  12. data/features/code_check/W0097.feature +4 -0
  13. data/features/code_check/W0100.feature +10 -0
  14. data/features/code_check/W0119.feature +8 -0
  15. data/features/code_check/W0133.feature +8 -0
  16. data/features/code_check/W0134.feature +8 -0
  17. data/features/code_check/W0136.feature +8 -0
  18. data/features/code_check/W0138.feature +8 -0
  19. data/features/code_check/W0140.feature +8 -0
  20. data/features/code_check/W0142.feature +8 -0
  21. data/features/code_check/W0143.feature +8 -0
  22. data/features/code_check/W0144.feature +8 -0
  23. data/features/code_check/W0145.feature +8 -0
  24. data/features/code_check/W0146.feature +8 -0
  25. data/features/code_check/W0147.feature +8 -0
  26. data/features/code_check/W0148.feature +8 -0
  27. data/features/code_check/W0149.feature +8 -0
  28. data/features/code_check/W0150.feature +8 -0
  29. data/features/code_check/W0151.feature +8 -0
  30. data/features/code_check/W0152.feature +8 -0
  31. data/features/code_check/W0153.feature +8 -0
  32. data/features/code_check/W0154.feature +8 -0
  33. data/features/code_check/W0155.feature +8 -0
  34. data/features/code_check/W0156.feature +8 -0
  35. data/features/code_check/W0157.feature +8 -0
  36. data/features/code_check/W0158.feature +8 -0
  37. data/features/code_check/W0159.feature +8 -0
  38. data/features/code_check/W0160.feature +8 -0
  39. data/features/code_check/W0161.feature +8 -0
  40. data/features/code_check/W0162.feature +8 -0
  41. data/features/code_check/W0163.feature +8 -0
  42. data/features/code_check/W0164.feature +8 -0
  43. data/features/code_check/W0165.feature +8 -0
  44. data/features/code_check/W0166.feature +8 -0
  45. data/features/code_check/W0167.feature +8 -0
  46. data/features/code_check/W0168.feature +8 -0
  47. data/features/code_check/W0169.feature +8 -0
  48. data/features/code_check/W0170.feature +8 -0
  49. data/features/code_check/W0171.feature +8 -0
  50. data/features/code_check/W0172.feature +8 -0
  51. data/features/code_check/W0173.feature +8 -0
  52. data/features/code_check/W0174.feature +8 -0
  53. data/features/code_check/W0175.feature +8 -0
  54. data/features/code_check/W0176.feature +8 -0
  55. data/features/code_check/W0177.feature +8 -0
  56. data/features/code_check/W0178.feature +8 -0
  57. data/features/code_check/W0179.feature +8 -0
  58. data/features/code_check/W0180.feature +8 -0
  59. data/features/code_check/W0181.feature +8 -0
  60. data/features/code_check/W0250.feature +8 -0
  61. data/features/code_check/W0422.feature +194 -0
  62. data/features/code_check/W0459.feature +16 -0
  63. data/features/code_check/W0460.feature +342 -0
  64. data/features/code_check/W0461.feature +5 -0
  65. data/features/code_check/W0497.feature +12 -0
  66. data/features/code_check/W0499.feature +6 -0
  67. data/features/code_check/W0502.feature +6 -0
  68. data/features/code_check/W0570.feature +47 -0
  69. data/features/code_check/W0573.feature +8 -0
  70. data/features/code_check/W0582.feature +4 -0
  71. data/features/code_check/W0583.feature +4 -0
  72. data/features/code_check/W0584.feature +10 -0
  73. data/features/code_check/W0599.feature +10 -0
  74. data/features/code_check/W0644.feature +2 -0
  75. data/features/code_check/W0649.feature +14 -0
  76. data/features/code_check/W0650.feature +12 -0
  77. data/features/code_check/W0685.feature +10 -0
  78. data/features/code_check/W0686.feature +8 -0
  79. data/features/code_check/W0711.feature +2 -0
  80. data/features/code_check/W0712.feature +2 -0
  81. data/features/code_check/W0713.feature +2 -0
  82. data/features/code_check/W0714.feature +2 -0
  83. data/features/code_check/W0715.feature +2 -0
  84. data/features/code_check/W0718.feature +2 -0
  85. data/features/code_check/W0719.feature +8 -0
  86. data/features/code_check/W0732.feature +18 -0
  87. data/features/code_check/W0733.feature +18 -0
  88. data/features/code_check/W0734.feature +24 -0
  89. data/features/code_check/W0735.feature +24 -0
  90. data/features/code_check/W0747.feature +8 -0
  91. data/features/code_check/W0749.feature +8 -0
  92. data/features/code_check/W0750.feature +8 -0
  93. data/features/code_check/W0753.feature +8 -0
  94. data/features/code_check/W0754.feature +8 -0
  95. data/features/code_check/W0759.feature +8 -0
  96. data/features/code_check/W0760.feature +8 -0
  97. data/features/code_check/W0761.feature +8 -0
  98. data/features/code_check/W0762.feature +8 -0
  99. data/features/code_check/W0794.feature +6 -0
  100. data/features/code_check/W1050.feature +8 -0
  101. data/features/code_check/W1066.feature +8 -0
  102. data/features/code_check/W1067.feature +8 -0
  103. data/features/code_check/W1068.feature +8 -0
  104. data/features/code_check/W1071.feature +4 -0
  105. data/features/code_check/W9003.feature +2 -0
  106. data/lib/adlint/cc1.rb +1 -0
  107. data/lib/adlint/cc1/branch.rb +34 -13
  108. data/lib/adlint/cc1/conv.rb +3 -3
  109. data/lib/adlint/cc1/ctrlexpr.rb +12 -7
  110. data/lib/adlint/cc1/environ.rb +12 -2
  111. data/lib/adlint/cc1/expr.rb +10 -8
  112. data/lib/adlint/cc1/interp.rb +56 -49
  113. data/lib/adlint/cc1/mediator.rb +9 -5
  114. data/lib/adlint/cc1/object.rb +37 -34
  115. data/lib/adlint/cc1/trace.rb +287 -0
  116. data/lib/adlint/cc1/type.rb +15 -15
  117. data/lib/adlint/cc1/value.rb +823 -427
  118. data/lib/adlint/cpp/eval.rb +5 -2
  119. data/lib/adlint/cpp/source.rb +21 -22
  120. data/lib/adlint/exam/c_builtin/cc1_check.rb +1636 -1067
  121. data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +28 -22
  122. data/lib/adlint/exam/c_builtin/cc1_code.rb +4 -4
  123. data/lib/adlint/exam/c_builtin/cc1_metric.rb +14 -14
  124. data/lib/adlint/location.rb +5 -7
  125. data/lib/adlint/metric.rb +2 -2
  126. data/lib/adlint/prelude.rb +6 -2
  127. data/lib/adlint/report.rb +2 -2
  128. data/lib/adlint/version.rb +3 -3
  129. data/share/doc/developers_guide_ja.html +10 -4
  130. data/share/doc/developers_guide_ja.texi +8 -2
  131. data/share/doc/users_guide_en.html +679 -72
  132. data/share/doc/users_guide_en.texi +557 -12
  133. data/share/doc/users_guide_ja.html +678 -74
  134. data/share/doc/users_guide_ja.texi +554 -13
  135. data/spec/adlint/cc1/ctrlexpr_spec.rb +20 -11
  136. data/spec/adlint/cc1/domain_spec.rb +9 -0
  137. metadata +4 -2
@@ -23,6 +23,8 @@ Feature: W0459
23
23
  | W0118 | 2 | 13 |
24
24
  | W0117 | 4 | 6 |
25
25
  | W0459 | 7 | 25 |
26
+ | C1000 | | |
27
+ | C1003 | 6 | 11 |
26
28
  | W0100 | 6 | 11 |
27
29
  | W0104 | 4 | 14 |
28
30
  | W0501 | 7 | 16 |
@@ -43,8 +45,14 @@ Feature: W0459
43
45
  | mesg | line | column |
44
46
  | W0117 | 1 | 5 |
45
47
  | W0705 | 4 | 14 |
48
+ | C1000 | | |
49
+ | C1006 | 1 | 13 |
46
50
  | W0705 | 4 | 17 |
51
+ | C1000 | | |
52
+ | C1006 | 1 | 13 |
47
53
  | W0459 | 4 | 16 |
54
+ | C1000 | | |
55
+ | C1003 | 3 | 9 |
48
56
  | W0100 | 3 | 9 |
49
57
  | W0104 | 1 | 13 |
50
58
  | W0950 | 3 | 14 |
@@ -70,6 +78,8 @@ Feature: W0459
70
78
  | mesg | line | column |
71
79
  | W0117 | 1 | 5 |
72
80
  | W0705 | 6 | 18 |
81
+ | C1000 | | |
82
+ | C1006 | 1 | 13 |
73
83
  | W0100 | 3 | 9 |
74
84
  | W0104 | 1 | 13 |
75
85
  | W1071 | 1 | 5 |
@@ -109,7 +119,13 @@ Feature: W0459
109
119
  | W0118 | 1 | 13 |
110
120
  | W0117 | 3 | 5 |
111
121
  | W0459 | 14 | 17 |
122
+ | C1000 | | |
123
+ | C1003 | 6 | 9 |
112
124
  | W0460 | 21 | 12 |
125
+ | C1000 | | |
126
+ | C1003 | 6 | 9 |
127
+ | C1001 | 8 | 18 |
128
+ | C1002 | 13 | 9 |
113
129
  | W0104 | 3 | 13 |
114
130
  | W9001 | 10 | 9 |
115
131
  | W9001 | 11 | 13 |
@@ -21,7 +21,349 @@ Feature: W0460
21
21
  | mesg | line | column |
22
22
  | W1076 | 1 | 12 |
23
23
  | W0459 | 5 | 14 |
24
+ | C1000 | | |
25
+ | C1003 | 3 | 9 |
24
26
  | W0460 | 9 | 13 |
27
+ | C1000 | | |
28
+ | C1003 | 3 | 9 |
29
+ | C1002 | 5 | 14 |
25
30
  | W0629 | 1 | 12 |
26
31
  | W0950 | 3 | 11 |
27
32
  | W0628 | 1 | 12 |
33
+
34
+ Scenario: possible uninitialized value reference because of an incomplete if
35
+ statement
36
+ Given a target source named "fixture.c" with:
37
+ """
38
+ void foo(int i)
39
+ {
40
+ int j;
41
+
42
+ if (i == 0) { /* false */
43
+ j = 0;
44
+ }
45
+
46
+ return j; /* W0460 */
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 | 6 |
53
+ | W0460 | 9 | 12 |
54
+ | C1000 | | |
55
+ | C1003 | 3 | 9 |
56
+ | C1002 | 5 | 11 |
57
+ | W0100 | 3 | 9 |
58
+ | W0104 | 1 | 14 |
59
+ | W0628 | 1 | 6 |
60
+
61
+ Scenario: possible uninitialized value reference because of an incomplete if
62
+ statement
63
+ Given a target source named "fixture.c" with:
64
+ """
65
+ void foo(int i)
66
+ {
67
+ int j;
68
+
69
+ if (i < 0) { /* false */
70
+ j = 1;
71
+ if (i < -10) {
72
+ j = 2;
73
+ }
74
+ else if (i < -5) {
75
+ j = 3;
76
+ }
77
+ }
78
+
79
+ return j; /* W0460 */
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 | 6 |
86
+ | W0460 | 15 | 12 |
87
+ | C1000 | | |
88
+ | C1003 | 3 | 9 |
89
+ | C1002 | 5 | 11 |
90
+ | W0104 | 1 | 14 |
91
+ | W1069 | 7 | 9 |
92
+ | W0628 | 1 | 6 |
93
+
94
+ Scenario: possible uninitialized value reference because of an incomplete
95
+ if-else-if statement
96
+ Given a target source named "fixture.c" with:
97
+ """
98
+ void foo(int i)
99
+ {
100
+ int j;
101
+
102
+ if (i < 0) { /* true */
103
+ if (i < -10) { /* false */
104
+ j = 2;
105
+ }
106
+ else if (i < -5) { /* false */
107
+ j = 3;
108
+ }
109
+ }
110
+ else {
111
+ j = 1;
112
+ }
113
+
114
+ return j; /* W0460 */
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 | 6 |
121
+ | W0460 | 17 | 12 |
122
+ | C1000 | | |
123
+ | C1003 | 3 | 9 |
124
+ | C1001 | 5 | 11 |
125
+ | C1002 | 6 | 15 |
126
+ | C1002 | 9 | 20 |
127
+ | W0104 | 1 | 14 |
128
+ | W1069 | 6 | 9 |
129
+ | W0628 | 1 | 6 |
130
+
131
+ Scenario: possible uninitialized value reference because of an incomplete if
132
+ statement
133
+ Given a target source named "fixture.c" with:
134
+ """
135
+ void foo(int i)
136
+ {
137
+ int j;
138
+
139
+ if (i < 0) { /* false */
140
+ if (i < -10) {
141
+ j = 2;
142
+ }
143
+ else if (i < -5) {
144
+ j = 3;
145
+ }
146
+ else {
147
+ j = 1;
148
+ }
149
+ }
150
+
151
+ return j; /* W0460 */
152
+ }
153
+ """
154
+ When I successfully run `adlint fixture.c` on noarch
155
+ Then the output should exactly match with:
156
+ | mesg | line | column |
157
+ | W0117 | 1 | 6 |
158
+ | W0460 | 17 | 12 |
159
+ | C1000 | | |
160
+ | C1003 | 3 | 9 |
161
+ | C1002 | 5 | 11 |
162
+ | W0104 | 1 | 14 |
163
+ | W0628 | 1 | 6 |
164
+
165
+ Scenario: possible uninitialized value reference because of missing
166
+ assignment in a complete if statement
167
+ Given a target source named "fixture.c" with:
168
+ """
169
+ void foo(int i)
170
+ {
171
+ int j;
172
+
173
+ if (i < 0) { /* true */
174
+ if (i < -10) { /* false */
175
+ j = 2;
176
+ }
177
+ else if (i < -5) { /* false */
178
+ j = 3;
179
+ }
180
+ else {
181
+ }
182
+ }
183
+ else {
184
+ j = 1;
185
+ }
186
+
187
+ return j; /* W0460 */
188
+ }
189
+ """
190
+ When I successfully run `adlint fixture.c` on noarch
191
+ Then the output should exactly match with:
192
+ | mesg | line | column |
193
+ | W0117 | 1 | 6 |
194
+ | W0460 | 19 | 12 |
195
+ | C1000 | | |
196
+ | C1003 | 3 | 9 |
197
+ | C1001 | 5 | 11 |
198
+ | C1002 | 6 | 15 |
199
+ | C1002 | 9 | 20 |
200
+ | W0104 | 1 | 14 |
201
+ | W0628 | 1 | 6 |
202
+
203
+ Scenario: possible uninitialized value reference because of an incomplete if
204
+ statement
205
+ Given a target source named "fixture.c" with:
206
+ """
207
+ void foo(int i)
208
+ {
209
+ int j;
210
+
211
+ if (i < 0) { /* false */
212
+ j = 1;
213
+ if (i < -10) {
214
+ j = 2;
215
+ }
216
+ }
217
+
218
+ return j; /* W0460 */
219
+ }
220
+ """
221
+ When I successfully run `adlint fixture.c` on noarch
222
+ Then the output should exactly match with:
223
+ | mesg | line | column |
224
+ | W0117 | 1 | 6 |
225
+ | W0460 | 12 | 12 |
226
+ | C1000 | | |
227
+ | C1003 | 3 | 9 |
228
+ | C1002 | 5 | 11 |
229
+ | W0104 | 1 | 14 |
230
+ | W0628 | 1 | 6 |
231
+
232
+ Scenario: possible uninitialized value reference because of an incomplete
233
+ if-else-if statement
234
+ Given a target source named "fixture.c" with:
235
+ """
236
+ int foo(int i)
237
+ {
238
+ int j;
239
+
240
+ if (i > 2) { /* true */
241
+ if (i == 5) { /* false */
242
+ j = 5;
243
+ }
244
+ else if (i == 6) { /* false */
245
+ j = 6;
246
+ }
247
+ }
248
+ else if (i < 0) {
249
+ j = -1;
250
+ }
251
+
252
+ return j; /* W0460 */
253
+ }
254
+ """
255
+ When I successfully run `adlint fixture.c` on noarch
256
+ Then the output should exactly match with:
257
+ | mesg | line | column |
258
+ | W0117 | 1 | 5 |
259
+ | W0460 | 17 | 12 |
260
+ | C1000 | | |
261
+ | C1003 | 3 | 9 |
262
+ | C1001 | 5 | 11 |
263
+ | C1002 | 6 | 15 |
264
+ | C1002 | 9 | 20 |
265
+ | W0104 | 1 | 13 |
266
+ | W1069 | 5 | 5 |
267
+ | W1069 | 6 | 9 |
268
+ | W0628 | 1 | 5 |
269
+
270
+ Scenario: variable is not possibly initialized because of an incomplete
271
+ selection statement
272
+ Given a target source named "fixture.c" with:
273
+ """
274
+ struct bar {
275
+ int x;
276
+ int y;
277
+ };
278
+
279
+ struct bar a[3];
280
+
281
+ int foo(int i, int j)
282
+ {
283
+ int k;
284
+
285
+ if (i < 0) {
286
+ struct bar b;
287
+ if (j == 0) {
288
+ return 0;
289
+ }
290
+ k = j < 10 ? b.x : b.y;
291
+ }
292
+ else if (i > 10) {
293
+ k = j ? a[0].x : a[1].y;
294
+ }
295
+
296
+ return k; /* W0460 */
297
+ }
298
+ """
299
+ When I successfully run `adlint fixture.c` on noarch
300
+ Then the output should exactly match with:
301
+ | mesg | line | column |
302
+ | W0117 | 6 | 12 |
303
+ | W0117 | 8 | 5 |
304
+ | W0459 | 17 | 20 |
305
+ | C1000 | | |
306
+ | C1003 | 13 | 20 |
307
+ | W0100 | 13 | 20 |
308
+ | W0460 | 23 | 12 |
309
+ | C1000 | | |
310
+ | C1003 | 10 | 9 |
311
+ | C1002 | 12 | 11 |
312
+ | C1002 | 19 | 16 |
313
+ | W0104 | 8 | 13 |
314
+ | W0104 | 8 | 20 |
315
+ | W1071 | 8 | 5 |
316
+ | W0950 | 6 | 14 |
317
+ | W1069 | 12 | 5 |
318
+ | W0501 | 17 | 20 |
319
+ | W0114 | 20 | 13 |
320
+ | W0628 | 8 | 5 |
321
+ | W0589 | 6 | 12 |
322
+ | W0593 | 6 | 12 |
323
+
324
+ Scenario: variable is initialized by a complete selection statement
325
+ Given a target source named "fixture.c" with:
326
+ """
327
+ struct bar {
328
+ int x;
329
+ int y;
330
+ };
331
+
332
+ struct bar a[3];
333
+
334
+ int foo(int i, int j)
335
+ {
336
+ int k;
337
+
338
+ if (i < 0) {
339
+ struct bar b;
340
+ if (j == 0) {
341
+ return 0;
342
+ }
343
+ k = j < 10 ? b.x : b.y;
344
+ }
345
+ else {
346
+ k = j ? a[0].x : a[1].y;
347
+ }
348
+
349
+ return k; /* OK */
350
+ }
351
+ """
352
+ When I successfully run `adlint fixture.c` on noarch
353
+ Then the output should exactly match with:
354
+ | mesg | line | column |
355
+ | W0117 | 6 | 12 |
356
+ | W0117 | 8 | 5 |
357
+ | W0459 | 17 | 20 |
358
+ | C1000 | | |
359
+ | C1003 | 13 | 20 |
360
+ | W0100 | 13 | 20 |
361
+ | W0104 | 8 | 13 |
362
+ | W0104 | 8 | 20 |
363
+ | W1071 | 8 | 5 |
364
+ | W0950 | 6 | 14 |
365
+ | W0501 | 17 | 20 |
366
+ | W0114 | 20 | 13 |
367
+ | W0628 | 8 | 5 |
368
+ | W0589 | 6 | 12 |
369
+ | W0593 | 6 | 12 |
@@ -86,7 +86,12 @@ Feature: W0461
86
86
  | W0117 | 3 | 6 |
87
87
  | W0534 | 7 | 10 |
88
88
  | W0705 | 8 | 11 |
89
+ | C1000 | | |
90
+ | C1006 | 3 | 14 |
89
91
  | W0462 | 11 | 9 |
92
+ | C1000 | | |
93
+ | C1003 | 5 | 9 |
94
+ | C1002 | 7 | 14 |
90
95
  | W0950 | 5 | 11 |
91
96
  | W0628 | 3 | 6 |
92
97
 
@@ -16,7 +16,11 @@ Feature: W0497
16
16
  | mesg | line | column |
17
17
  | W1076 | 1 | 12 |
18
18
  | W0116 | 3 | 14 |
19
+ | C1000 | | |
20
+ | C1006 | 1 | 29 |
19
21
  | W0116 | 3 | 23 |
22
+ | C1000 | | |
23
+ | C1006 | 1 | 45 |
20
24
  | W0104 | 1 | 29 |
21
25
  | W0104 | 1 | 45 |
22
26
  | W0629 | 1 | 12 |
@@ -37,7 +41,11 @@ Feature: W0497
37
41
  | mesg | line | column |
38
42
  | W1076 | 1 | 12 |
39
43
  | W0116 | 3 | 15 |
44
+ | C1000 | | |
45
+ | C1006 | 1 | 29 |
40
46
  | W0116 | 3 | 26 |
47
+ | C1000 | | |
48
+ | C1006 | 1 | 45 |
41
49
  | W0104 | 1 | 29 |
42
50
  | W0104 | 1 | 45 |
43
51
  | W0629 | 1 | 12 |
@@ -56,7 +64,11 @@ Feature: W0497
56
64
  | mesg | line | column |
57
65
  | W1076 | 1 | 12 |
58
66
  | W0116 | 3 | 15 |
67
+ | C1000 | | |
68
+ | C1006 | 1 | 29 |
59
69
  | W0116 | 3 | 24 |
70
+ | C1000 | | |
71
+ | C1006 | 1 | 45 |
60
72
  | W0104 | 1 | 29 |
61
73
  | W0104 | 1 | 45 |
62
74
  | W0629 | 1 | 12 |
@@ -16,6 +16,8 @@ Feature: W0499
16
16
  | mesg | line | column |
17
17
  | W1076 | 1 | 21 |
18
18
  | W0116 | 3 | 14 |
19
+ | C1000 | | |
20
+ | C1006 | 1 | 38 |
19
21
  | W0104 | 1 | 38 |
20
22
  | W0104 | 1 | 54 |
21
23
  | W0104 | 1 | 70 |
@@ -36,6 +38,8 @@ Feature: W0499
36
38
  | mesg | line | column |
37
39
  | W1076 | 1 | 21 |
38
40
  | W0116 | 3 | 15 |
41
+ | C1000 | | |
42
+ | C1006 | 1 | 38 |
39
43
  | W0104 | 1 | 38 |
40
44
  | W0104 | 1 | 54 |
41
45
  | W0104 | 1 | 70 |
@@ -55,6 +59,8 @@ Feature: W0499
55
59
  | mesg | line | column |
56
60
  | W1076 | 1 | 21 |
57
61
  | W0116 | 3 | 15 |
62
+ | C1000 | | |
63
+ | C1006 | 1 | 38 |
58
64
  | W0104 | 1 | 38 |
59
65
  | W0104 | 1 | 54 |
60
66
  | W0104 | 1 | 70 |