msg_348.c revision 1.8 1 1.8 rillig /* $NetBSD: msg_348.c,v 1.8 2023/01/14 11:15:07 rillig Exp $ */
2 1.1 rillig # 3 "msg_348.c"
3 1.1 rillig
4 1.1 rillig // Test for message 348: maximum value %d of '%s' does not match maximum array index %d [348]
5 1.1 rillig
6 1.3 rillig /* lint1-extra-flags: -r */
7 1.3 rillig
8 1.1 rillig enum color {
9 1.1 rillig red,
10 1.1 rillig green,
11 1.8 rillig /* expect+5: previous declaration of 'blue' [260] */
12 1.8 rillig /* expect+4: previous declaration of 'blue' [260] */
13 1.8 rillig /* expect+3: previous declaration of 'blue' [260] */
14 1.5 rillig /* expect+2: previous declaration of 'blue' [260] */
15 1.5 rillig /* expect+1: previous declaration of 'blue' [260] */
16 1.1 rillig blue
17 1.1 rillig };
18 1.1 rillig
19 1.1 rillig const char *
20 1.1 rillig color_name(enum color color)
21 1.1 rillig {
22 1.1 rillig static const char *name[] = {
23 1.1 rillig "red",
24 1.1 rillig "green",
25 1.1 rillig "blue"
26 1.1 rillig };
27 1.1 rillig /* No warning since the maximum enum value matches the array size. */
28 1.1 rillig return name[color];
29 1.1 rillig }
30 1.1 rillig
31 1.1 rillig const char *
32 1.1 rillig color_name_too_few(enum color color)
33 1.1 rillig {
34 1.1 rillig static const char *name[] = {
35 1.1 rillig "red",
36 1.1 rillig "green"
37 1.1 rillig };
38 1.1 rillig /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 1 [348] */
39 1.1 rillig return name[color];
40 1.1 rillig }
41 1.1 rillig
42 1.1 rillig const char *
43 1.1 rillig color_name_too_many(enum color color)
44 1.1 rillig {
45 1.1 rillig static const char *name[] = {
46 1.1 rillig "red",
47 1.1 rillig "green",
48 1.1 rillig "blue",
49 1.1 rillig "black"
50 1.1 rillig };
51 1.1 rillig /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
52 1.1 rillig return name[color];
53 1.1 rillig }
54 1.1 rillig
55 1.1 rillig const char *
56 1.1 rillig color_name_computed_index(enum color color)
57 1.1 rillig {
58 1.1 rillig static const char *name[] = {
59 1.1 rillig "unused",
60 1.1 rillig "red",
61 1.1 rillig "green",
62 1.1 rillig "blue"
63 1.1 rillig };
64 1.6 rillig /* No warning since the array index is not a plain identifier. */
65 1.1 rillig return name[color + 1];
66 1.1 rillig }
67 1.1 rillig
68 1.1 rillig const char *
69 1.1 rillig color_name_cast_from_int(int c)
70 1.1 rillig {
71 1.1 rillig static const char *name[] = {
72 1.1 rillig "unused",
73 1.1 rillig "red",
74 1.1 rillig "green",
75 1.1 rillig "blue"
76 1.1 rillig };
77 1.6 rillig /*
78 1.6 rillig * No warning since the array index before conversion is not a plain
79 1.6 rillig * identifier.
80 1.6 rillig */
81 1.1 rillig return name[(enum color)(c + 1)];
82 1.1 rillig }
83 1.1 rillig
84 1.1 rillig const char *
85 1.2 rillig color_name_explicit_cast_to_int(enum color color)
86 1.2 rillig {
87 1.2 rillig static const char *name[] = {
88 1.2 rillig "red",
89 1.2 rillig "green",
90 1.2 rillig };
91 1.4 rillig /* No warning due to the explicit cast. */
92 1.2 rillig return name[(int)color];
93 1.2 rillig }
94 1.2 rillig
95 1.2 rillig const char *
96 1.1 rillig color_name_computed_pointer(enum color color, const char *name)
97 1.1 rillig {
98 1.6 rillig /*
99 1.6 rillig * No warning since the first operand of the selection expression
100 1.6 rillig * is '(&name)', whose type is not an array but instead a
101 1.6 rillig * 'pointer to pointer to const char'.
102 1.6 rillig */
103 1.1 rillig return (&name)[color];
104 1.1 rillig }
105 1.1 rillig
106 1.8 rillig /*
107 1.8 rillig * If the accessed array has character type, it may contain a trailing null
108 1.8 rillig * character.
109 1.8 rillig */
110 1.8 rillig void
111 1.8 rillig color_initial_letter(enum color color)
112 1.8 rillig {
113 1.8 rillig static const char len_2_null[] = "RG";
114 1.8 rillig static const char len_3_null[] = "RGB";
115 1.8 rillig static const char len_4_null[] = "RGB_";
116 1.8 rillig
117 1.8 rillig static const char len_2_of_3[3] = "RG";
118 1.8 rillig static const char len_3_of_3[3] = "RGB";
119 1.8 rillig static const char len_4_of_4[4] = "RGB_";
120 1.8 rillig
121 1.8 rillig /* TODO: array is too short */
122 1.8 rillig if (len_2_null[color] != '\0')
123 1.8 rillig return;
124 1.8 rillig
125 1.8 rillig /* FIXME: lint should not warn since the maximum usable array index is 2 */
126 1.8 rillig /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
127 1.8 rillig if (len_3_null[color] != '\0')
128 1.8 rillig return;
129 1.8 rillig
130 1.8 rillig /* FIXME: lint should not warn since the maximum usable array index is 3, not 4 */
131 1.8 rillig /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 4 [348] */
132 1.8 rillig if (len_4_null[color] != '\0')
133 1.8 rillig return;
134 1.8 rillig
135 1.8 rillig /*
136 1.8 rillig * The array has 3 elements, as expected. If lint were to inspect
137 1.8 rillig * the content of the array, it could see that [2] is a null
138 1.8 rillig * character. That null character may be intended though.
139 1.8 rillig */
140 1.8 rillig if (len_2_of_3[color] != '\0')
141 1.8 rillig return;
142 1.8 rillig
143 1.8 rillig if (len_3_of_3[color] != '\0')
144 1.8 rillig return;
145 1.8 rillig
146 1.8 rillig /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
147 1.8 rillig if (len_4_of_4[color])
148 1.8 rillig return;
149 1.8 rillig }
150 1.8 rillig
151 1.1 rillig extern const char *incomplete_color_name[];
152 1.1 rillig
153 1.1 rillig const char *
154 1.1 rillig color_name_incomplete_array(enum color color)
155 1.1 rillig {
156 1.1 rillig /* No warning since 'incomplete_color_name' is incomplete. */
157 1.1 rillig return incomplete_color_name[color];
158 1.1 rillig }
159 1.1 rillig
160 1.1 rillig enum large {
161 1.1 rillig /* expect+1: warning: integral constant too large [56] */
162 1.1 rillig min = -1LL << 40,
163 1.1 rillig /* expect+1: warning: integral constant too large [56] */
164 1.1 rillig max = 1LL << 40,
165 1.1 rillig zero = 0
166 1.1 rillig };
167 1.1 rillig
168 1.1 rillig const char *
169 1.1 rillig large_name(enum large large)
170 1.1 rillig {
171 1.1 rillig static const char *name[] = {
172 1.1 rillig "dummy",
173 1.1 rillig };
174 1.1 rillig /* No warning since at least 1 enum constant is outside of INT. */
175 1.1 rillig return name[large];
176 1.1 rillig }
177 1.3 rillig
178 1.3 rillig enum color_with_count {
179 1.3 rillig cc_red,
180 1.3 rillig cc_green,
181 1.3 rillig cc_blue,
182 1.3 rillig cc_num_values
183 1.3 rillig };
184 1.3 rillig
185 1.3 rillig const char *
186 1.3 rillig color_with_count_name(enum color_with_count color)
187 1.3 rillig {
188 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
189 1.6 rillig /*
190 1.6 rillig * No warning since the word 'num' in the last enum constant
191 1.6 rillig * MAY indicate a convenience constant for the total number of
192 1.6 rillig * values, instead of a regular enum value.
193 1.6 rillig */
194 1.3 rillig return name[color];
195 1.3 rillig }
196 1.3 rillig
197 1.3 rillig /*
198 1.3 rillig * If the last enum constant contains "num" in its name, it is not
199 1.3 rillig * necessarily the count of the other enum values, it may also be a
200 1.3 rillig * legitimate application value, therefore don't warn in this case.
201 1.3 rillig */
202 1.3 rillig const char *
203 1.3 rillig color_with_num(enum color_with_count color)
204 1.3 rillig {
205 1.3 rillig static const char *const name[] = { "r", "g", "b", "num" };
206 1.3 rillig /* No warning since the maximum values already match. */
207 1.3 rillig return name[color];
208 1.3 rillig }
209 1.3 rillig
210 1.3 rillig enum color_with_uc_count {
211 1.3 rillig CC_RED,
212 1.3 rillig CC_GREEN,
213 1.3 rillig CC_BLUE,
214 1.3 rillig CC_NUM_VALUES
215 1.3 rillig };
216 1.3 rillig
217 1.3 rillig const char *
218 1.3 rillig color_with_uc_count_name(enum color_with_uc_count color)
219 1.3 rillig {
220 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
221 1.3 rillig /* No warning since the maximum enum constant is a count. */
222 1.3 rillig return name[color];
223 1.3 rillig }
224 1.6 rillig
225 1.6 rillig enum uppercase_max {
226 1.6 rillig M_FIRST,
227 1.6 rillig M_SECOND,
228 1.6 rillig M_MAX
229 1.6 rillig };
230 1.6 rillig
231 1.6 rillig const char *
232 1.6 rillig uppercase_max_name(enum uppercase_max x)
233 1.6 rillig {
234 1.6 rillig static const char *const name[] = { "first", "second" };
235 1.6 rillig return name[x];
236 1.6 rillig }
237 1.6 rillig
238 1.6 rillig enum lowercase_max {
239 1.6 rillig M_first,
240 1.6 rillig M_second,
241 1.6 rillig M_max
242 1.6 rillig };
243 1.6 rillig
244 1.6 rillig const char *
245 1.6 rillig lowercase_max_name(enum lowercase_max x)
246 1.6 rillig {
247 1.6 rillig static const char *const name[] = { "first", "second" };
248 1.6 rillig return name[x];
249 1.6 rillig }
250