msg_348.c revision 1.14 1 1.14 rillig /* $NetBSD: msg_348.c,v 1.14 2025/07/11 19:03:01 rillig Exp $ */
2 1.1 rillig # 3 "msg_348.c"
3 1.1 rillig
4 1.12 rillig // Test for message: maximum value %d for '%s' of type '%s' does not match maximum array index %d [348]
5 1.1 rillig
6 1.9 rillig /* lint1-extra-flags: -r -X 351 */
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.12 rillig /* No warning since the maximum enum value equals the maximum array index. */
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.12 rillig /* expect+1: warning: maximum value 2 for 'blue' of type '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.12 rillig /* expect+1: warning: maximum value 2 for 'blue' of type '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.14 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 1 [348] */
122 1.8 rillig if (len_2_null[color] != '\0')
123 1.8 rillig return;
124 1.8 rillig
125 1.8 rillig if (len_3_null[color] != '\0')
126 1.8 rillig return;
127 1.8 rillig
128 1.14 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */
129 1.8 rillig if (len_4_null[color] != '\0')
130 1.8 rillig return;
131 1.8 rillig
132 1.8 rillig /*
133 1.8 rillig * The array has 3 elements, as expected. If lint were to inspect
134 1.8 rillig * the content of the array, it could see that [2] is a null
135 1.8 rillig * character. That null character may be intended though.
136 1.8 rillig */
137 1.8 rillig if (len_2_of_3[color] != '\0')
138 1.8 rillig return;
139 1.8 rillig
140 1.8 rillig if (len_3_of_3[color] != '\0')
141 1.8 rillig return;
142 1.8 rillig
143 1.12 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */
144 1.8 rillig if (len_4_of_4[color])
145 1.8 rillig return;
146 1.8 rillig }
147 1.8 rillig
148 1.1 rillig extern const char *incomplete_color_name[];
149 1.1 rillig
150 1.1 rillig const char *
151 1.1 rillig color_name_incomplete_array(enum color color)
152 1.1 rillig {
153 1.1 rillig /* No warning since 'incomplete_color_name' is incomplete. */
154 1.1 rillig return incomplete_color_name[color];
155 1.1 rillig }
156 1.1 rillig
157 1.1 rillig enum large {
158 1.11 rillig /* expect+1: warning: constant -0x10000000000 too large for 'int' [56] */
159 1.1 rillig min = -1LL << 40,
160 1.11 rillig /* expect+1: warning: constant 0x10000000000 too large for 'int' [56] */
161 1.1 rillig max = 1LL << 40,
162 1.1 rillig zero = 0
163 1.1 rillig };
164 1.1 rillig
165 1.1 rillig const char *
166 1.1 rillig large_name(enum large large)
167 1.1 rillig {
168 1.1 rillig static const char *name[] = {
169 1.1 rillig "dummy",
170 1.1 rillig };
171 1.1 rillig /* No warning since at least 1 enum constant is outside of INT. */
172 1.1 rillig return name[large];
173 1.1 rillig }
174 1.3 rillig
175 1.3 rillig enum color_with_count {
176 1.3 rillig cc_red,
177 1.3 rillig cc_green,
178 1.3 rillig cc_blue,
179 1.3 rillig cc_num_values
180 1.3 rillig };
181 1.3 rillig
182 1.3 rillig const char *
183 1.3 rillig color_with_count_name(enum color_with_count color)
184 1.3 rillig {
185 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
186 1.6 rillig /*
187 1.6 rillig * No warning since the word 'num' in the last enum constant
188 1.6 rillig * MAY indicate a convenience constant for the total number of
189 1.6 rillig * values, instead of a regular enum value.
190 1.6 rillig */
191 1.3 rillig return name[color];
192 1.3 rillig }
193 1.3 rillig
194 1.3 rillig /*
195 1.3 rillig * If the last enum constant contains "num" in its name, it is not
196 1.3 rillig * necessarily the count of the other enum values, it may also be a
197 1.3 rillig * legitimate application value, therefore don't warn in this case.
198 1.3 rillig */
199 1.3 rillig const char *
200 1.3 rillig color_with_num(enum color_with_count color)
201 1.3 rillig {
202 1.3 rillig static const char *const name[] = { "r", "g", "b", "num" };
203 1.3 rillig /* No warning since the maximum values already match. */
204 1.3 rillig return name[color];
205 1.3 rillig }
206 1.3 rillig
207 1.3 rillig enum color_with_uc_count {
208 1.3 rillig CC_RED,
209 1.3 rillig CC_GREEN,
210 1.3 rillig CC_BLUE,
211 1.3 rillig CC_NUM_VALUES
212 1.3 rillig };
213 1.3 rillig
214 1.3 rillig const char *
215 1.3 rillig color_with_uc_count_name(enum color_with_uc_count color)
216 1.3 rillig {
217 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
218 1.3 rillig /* No warning since the maximum enum constant is a count. */
219 1.3 rillig return name[color];
220 1.3 rillig }
221 1.6 rillig
222 1.6 rillig enum uppercase_max {
223 1.6 rillig M_FIRST,
224 1.6 rillig M_SECOND,
225 1.6 rillig M_MAX
226 1.6 rillig };
227 1.6 rillig
228 1.6 rillig const char *
229 1.6 rillig uppercase_max_name(enum uppercase_max x)
230 1.6 rillig {
231 1.6 rillig static const char *const name[] = { "first", "second" };
232 1.6 rillig return name[x];
233 1.6 rillig }
234 1.6 rillig
235 1.6 rillig enum lowercase_max {
236 1.6 rillig M_first,
237 1.6 rillig M_second,
238 1.6 rillig M_max
239 1.6 rillig };
240 1.6 rillig
241 1.6 rillig const char *
242 1.6 rillig lowercase_max_name(enum lowercase_max x)
243 1.6 rillig {
244 1.6 rillig static const char *const name[] = { "first", "second" };
245 1.6 rillig return name[x];
246 1.6 rillig }
247 1.12 rillig
248 1.12 rillig enum uppercase_n {
249 1.12 rillig UPPERCASE_N_FIRST,
250 1.12 rillig UPPERCASE_N_LAST,
251 1.12 rillig N_UPPERCASE_N,
252 1.12 rillig };
253 1.12 rillig
254 1.12 rillig const char*
255 1.12 rillig uppercase_n_name(enum uppercase_n x)
256 1.12 rillig {
257 1.12 rillig static const char *const name[] = { "first", "last" };
258 1.12 rillig return name[x];
259 1.12 rillig }
260 1.13 rillig
261 1.13 rillig
262 1.13 rillig enum unit_prefix {
263 1.14 rillig /* expect+4: previous declaration of 'MEGA' [260] */
264 1.14 rillig /* expect+3: previous declaration of 'MEGA' [260] */
265 1.13 rillig /* expect+2: previous declaration of 'MEGA' [260] */
266 1.13 rillig /* expect+1: previous declaration of 'MEGA' [260] */
267 1.13 rillig NONE = 0, KILO = 1, MEGA = 2
268 1.13 rillig };
269 1.13 rillig
270 1.13 rillig char
271 1.13 rillig unit_name(enum unit_prefix prefix)
272 1.13 rillig {
273 1.13 rillig char name;
274 1.13 rillig
275 1.13 rillig static const char name_short[] = "-K";
276 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 1 [348] */
277 1.13 rillig name = name_short[prefix];
278 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 1 [348] */
279 1.13 rillig name = "-K"[prefix];
280 1.13 rillig
281 1.13 rillig static const char name_no_nul[] = { '-', 'K', 'M' };
282 1.13 rillig name = name_no_nul[prefix];
283 1.13 rillig name = (char[]){'-', 'K', 'M'}[prefix];
284 1.13 rillig
285 1.13 rillig static const char name_nul[] = "-KM";
286 1.13 rillig name = name_nul[prefix];
287 1.13 rillig name = "-KM"[prefix];
288 1.13 rillig
289 1.13 rillig static const char name_long[] = "-KMG";
290 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 3 [348] */
291 1.13 rillig name = name_long[prefix];
292 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 3 [348] */
293 1.13 rillig name = "-KMG"[prefix];
294 1.13 rillig
295 1.13 rillig return name;
296 1.13 rillig }
297