1 /* { dg-do compile } */ 2 /* { dg-options "-O3 -Warray-bounds=2" } */ 3 4 typedef __SIZE_TYPE__ size_t; 5 extern void* malloc(size_t x); 6 7 int e[3]; 8 9 struct f { int f[3]; }; 10 11 extern void bar(int v[]); 12 13 struct h { 14 15 int i; 16 int j[]; 17 }; 18 19 struct h0 { 20 21 int i; 22 int j[0]; 23 }; 24 25 struct h0b { 26 27 int i; 28 int j[0]; 29 int k; 30 }; 31 32 struct h1 { 33 34 int i; 35 int j[1]; 36 }; 37 38 struct h1b { 39 40 int i; 41 int j[1]; 42 int k; 43 }; 44 45 struct h3 { 46 47 int i; 48 int j[3]; 49 }; 50 51 struct h3b { 52 53 int i; 54 int j[3]; 55 int k; 56 }; 57 foo(int (* a)[3])58void foo(int (*a)[3]) 59 { 60 (*a)[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */ 61 a[0][0] = 1; // ok 62 a[1][0] = 1; // ok 63 a[1][4] = 1; /* { dg-warning "subscript 4 is above array bound" } */ 64 65 int c[3] = { 0 }; 66 67 c[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */ 68 69 e[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */ 70 71 struct f f; 72 f.f[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */ 73 74 struct h* h = malloc(sizeof(struct h) + 3 * sizeof(int)); 75 struct h0* h0 = malloc(sizeof(struct h0) + 3 * sizeof(int)); 76 struct h1* h1 = malloc(sizeof(struct h1) + 3 * sizeof(int)); 77 struct h3* h3 = malloc(sizeof(struct h3)); 78 79 h->j[4] = 1; // flexible array member 80 h0->j[4] = 1; // zero-sized array extension 81 h1->j[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */ 82 h3->j[4] = 1; /* { dg-warning "subscript 4 is above array bound" } */ 83 84 struct h0b* h0b = malloc(sizeof(struct h) + 3 * sizeof(int)); 85 struct h1b* h1b = malloc(sizeof(struct h1b) + 3 * sizeof(int)); 86 struct h3b* h3b = malloc(sizeof(struct h3b)); 87 // h0b->j[4] = 1; 88 h1b->j[4] = 1;; /* { dg-warning "subscript 4 is above array bound" } */ 89 h3b->j[4] = 1;; /* { dg-warning "subscript 4 is above array bound" } */ 90 91 // make sure nothing gets optimized away 92 bar(*a); 93 bar(c); 94 bar(e); 95 bar(f.f); 96 bar(h1->j); 97 bar(h3->j); 98 bar(h3b->j); 99 bar(h1b->j); 100 bar(h->j); 101 bar(h0->j); 102 } 103 104