annotate gcc/testsuite/gcc.dg/Warray-bounds-11.c @ 111:04ced10e8804

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