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