msg_168.c revision 1.6
11.6Srillig/* $NetBSD: msg_168.c,v 1.6 2022/05/30 08:04:00 rillig Exp $ */ 21.1Srillig# 3 "msg_168.c" 31.1Srillig 41.1Srillig// Test for message: array subscript cannot be > %d: %ld [168] 51.1Srillig 61.2Srilligvoid print_string(const char *); 71.2Srilligvoid print_char(char); 81.2Srillig 91.2Srilligvoid 101.2Srilligexample(void) 111.2Srillig{ 121.4Srillig char buf[20] = {}; /* empty initializer is a GCC extension */ 131.2Srillig 141.2Srillig print_string(buf + 19); /* inside the array */ 151.2Srillig 161.2Srillig /* 171.2Srillig * It is valid to point at the end of the array, but reading a 181.2Srillig * character from there invokes undefined behavior. 191.2Srillig * 201.2Srillig * The pointer to the end of the array is typically used in (begin, 211.2Srillig * end) tuples. These are more common in C++ than in C though. 221.2Srillig */ 231.2Srillig print_string(buf + 20); 241.2Srillig 251.2Srillig print_string(buf + 21); /* undefined behavior, not detected */ 261.2Srillig 271.2Srillig print_char(buf[19]); 281.2Srillig print_char(buf[20]); /* expect: 168 */ 291.2Srillig} 301.3Srillig 311.3Srilligvoid 321.3Srilligarray_with_c99_initializer(void) 331.3Srillig{ 341.3Srillig static const char *const to_roman[] = { 351.3Srillig ['0'] = "undefined", 361.3Srillig ['5'] = "V", 371.3Srillig ['9'] = "IX" 381.3Srillig }; 391.3Srillig 401.5Srillig print_string(to_roman['9']); 411.3Srillig print_string(to_roman[':']); /* expect: 168 */ 421.3Srillig} 431.6Srillig 441.6Srillig 451.6Srilligstruct s { 461.6Srillig char offset_0; 471.6Srillig char offset_1; 481.6Srillig int offset_4; 491.6Srillig short offset_8; 501.6Srillig char offset_10; 511.6Srillig}; 521.6Srillig 531.6Srilligstruct s 541.6Srilligs_init(void) 551.6Srillig{ 561.6Srillig struct s s[1]; 571.6Srillig s->offset_0 = 1; 581.6Srillig /* expect+1: warning: array subscript cannot be > 0: 1 [168] */ 591.6Srillig s->offset_1 = 2; 601.6Srillig /* expect+1: warning: array subscript cannot be > 0: 4 [168] */ 611.6Srillig s->offset_4 = 3; 621.6Srillig /* expect+1: warning: array subscript cannot be > 0: 8 [168] */ 631.6Srillig s->offset_8 = 4; 641.6Srillig /* expect+1: warning: array subscript cannot be > 0: 10 [168] */ 651.6Srillig s->offset_10 = 5; 661.6Srillig return s[0]; 671.6Srillig} 68