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