Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/c-c++-common/Warray-bounds.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 /* PR tree-optimization/82588 - missing -Warray-bounds on an excessively | |
2 large index | |
3 { dg-do compile } | |
4 { dg-require-effective-target alloca } | |
5 { dg-options "-O2 -Warray-bounds -ftrack-macro-expansion=0" } */ | |
6 | |
7 #include "../gcc.dg/range.h" | |
8 | |
9 #define offsetof(T, m) __builtin_offsetof (T, m) | |
10 | |
11 typedef struct AX { int n; char ax[]; } AX; | |
12 | |
13 typedef struct A1 { int i; char a1[1]; } A1; | |
14 typedef struct B { int i; struct A1 a1x[]; } B; | |
15 | |
16 void sink (int, ...); | |
17 | |
18 #define R(min, max) signed_range (min, max) | |
19 #define T(expr) sink (0, expr) | |
20 | |
21 struct __attribute__ ((packed)) S16 { unsigned i: 16; }; | |
22 | |
23 void farr_char (void) | |
24 { | |
25 extern char ac[]; | |
26 | |
27 T (ac[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .char *\\\[]." } */ | |
28 T (ac[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
29 T (ac[0]); | |
30 | |
31 T (ac[DIFF_MAX - 1]); | |
32 T (ac[DIFF_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
33 T (ac[DIFF_MAX + (size_t)1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
34 T (ac[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
35 T (ac[R (DIFF_MAX - 1, DIFF_MAX)]); | |
36 T (ac[R (DIFF_MIN + 1, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
37 T (ac[R (DIFF_MIN + 1, 0)]); | |
38 T (ac[R (-1, 0)]); | |
39 T (ac[R (-1, 1)]); | |
40 } | |
41 | |
42 void farr_s16 (void) | |
43 { | |
44 extern struct S16 ax[]; | |
45 | |
46 T (ax[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[]." } */ | |
47 T (ax[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
48 T (ax[0]); | |
49 | |
50 T (ax[DIFF_MAX / 2 - 1]); | |
51 T (ax[DIFF_MAX / 2]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
52 T (ax[DIFF_MAX / 2 + (size_t)1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
53 T (ax[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
54 T (ax[R (DIFF_MIN, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
55 T (ax[R (DIFF_MAX / 2 - 1, DIFF_MAX)]); | |
56 T (ax[R (DIFF_MAX / 2, DIFF_MAX)]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
57 } | |
58 | |
59 void farr_s16_7 (void) | |
60 { | |
61 extern struct S16 ax_7[][7]; | |
62 | |
63 T (ax_7[0][DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[7]." } */ | |
64 T (ax_7[0][-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
65 T (ax_7[0][0]); | |
66 T (ax_7[0][7]); /* { dg-warning "array subscript 7 is above array bounds of .(struct )?S16 *\\\[7]." } */ | |
67 T (ax_7[0][8]); /* { dg-warning "array subscript 8 is above array bounds of .(struct )?S16 *\\\[7]." } */ | |
68 | |
69 T (ax_7[0][DIFF_MAX / 2]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
70 T (ax_7[0][SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
71 | |
72 T (ax_7[DIFF_MIN][0]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[]\\\[7]." } */ | |
73 T (ax_7[-1][0]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
74 | |
75 T (ax_7[DIFF_MAX / 2][0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
76 T (ax_7[SIZE_MAX][0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
77 | |
78 ptrdiff_t i = R (DIFF_MIN, -1); | |
79 T (ax_7[i][0]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
80 | |
81 T (ax_7[R (DIFF_MIN, -1)][0]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
82 T (ax_7[R (DIFF_MIN, 0)][0]); | |
83 T (ax_7[R (-2, -1)][0]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
84 T (ax_7[R (-1, 0)][0]); | |
85 T (ax_7[R (-1, 1)][0]); | |
86 T (ax_7[R (-1, 7)][0]); | |
87 T (ax_7[R (-1, DIFF_MAX)][0]); | |
88 | |
89 T (ax_7[R ( 1, DIFF_MAX)][0]); | |
90 T (ax_7[R (DIFF_MAX / 14 - 1, DIFF_MAX)][0]); | |
91 | |
92 i = R (DIFF_MAX / 14, DIFF_MAX); | |
93 T (ax_7[i][0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
94 | |
95 T (ax_7[0][R (DIFF_MIN, 0)]); | |
96 T (ax_7[0][R (-1, 0)]); | |
97 T (ax_7[0][R (-1, 1)]); | |
98 T (ax_7[0][R (-1, 7)]); | |
99 T (ax_7[0][R (-1, DIFF_MAX)]); | |
100 T (ax_7[0][R (-1, DIFF_MAX)]); | |
101 | |
102 T (ax_7[0][R (1, DIFF_MAX)]); | |
103 T (ax_7[0][R (7, DIFF_MAX)]); /* { dg-warning "array subscript 7 is above array bounds" } */ | |
104 | |
105 } | |
106 | |
107 void farr_x_5_7 (void) | |
108 { | |
109 extern struct S16 a[][5][7]; | |
110 | |
111 T (a[0][0][-3]); /* { dg-warning "array subscript -3 is below array bounds of .(struct )?S16 *\\\[7]." } */ | |
112 T (a[0][-2][0]); /* { dg-warning "array subscript -2 is below array bounds of .(struct )?S16 *\\\[5]\\\[7]." } */ | |
113 T (a[-1][0][0]); /* { dg-warning "array subscript -1 is below array bounds of .(struct )?S16 *\\\[]\\\[5]\\\[7]." } */ | |
114 T (a[R (-4, -3)][0][0]); /* { dg-warning "array subscript -3 is below array bounds" } */ | |
115 T (a[0][R (-3, -2)][0]); /* { dg-warning "array subscript -2 is below array bounds" } */ | |
116 T (a[0][0][R (-2, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
117 } | |
118 | |
119 | |
120 void fax (struct AX *p) | |
121 { | |
122 T (p->ax[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
123 T (p->ax[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
124 T (p->ax[0]); | |
125 T (p->ax[DIFF_MAX - sizeof *p - 1]); | |
126 T (p->ax[DIFF_MAX - sizeof *p]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
127 T (p->ax[DIFF_MAX - sizeof *p + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
128 T (p->ax[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
129 T (p->ax[R (DIFF_MIN, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
130 T (p->ax[R (-1, 1)]); | |
131 T (p->ax[R (0, DIFF_MAX - 1)]); | |
132 T (p->ax[R (DIFF_MAX - 1, DIFF_MAX)]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
133 } | |
134 | |
135 void fa1 (struct A1 *p) | |
136 { | |
137 T (p->a1[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
138 T (p->a1[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
139 T (p->a1[0]); | |
140 T (p->a1[9]); | |
141 T (p->a1[DIFF_MAX - offsetof (A1, a1) - 1]); | |
142 T (p->a1[DIFF_MAX - offsetof (A1, a1)]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
143 T (p->a1[DIFF_MAX - offsetof (A1, a1) + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
144 T (p->a1[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
145 } | |
146 | |
147 void fb (struct B *p) | |
148 { | |
149 T (p->a1x->a1[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
150 T (p->a1x->a1[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
151 T (p->a1x->a1[0]); | |
152 T (p->a1x->a1[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
153 T (p->a1x->a1[DIFF_MAX - sizeof *p]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
154 T (p->a1x->a1[DIFF_MAX - sizeof *p + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
155 T (p->a1x->a1[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
156 | |
157 T (p->a1x[1].a1[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
158 T (p->a1x[1].a1[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
159 T (p->a1x[1].a1[0]); | |
160 T (p->a1x[1].a1[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
161 T (p->a1x[1].a1[DIFF_MAX - sizeof *p]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
162 T (p->a1x[1].a1[DIFF_MAX - sizeof *p + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
163 T (p->a1x[1].a1[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
164 | |
165 T (p->a1x[2].a1[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
166 T (p->a1x[2].a1[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
167 T (p->a1x[2].a1[0]); | |
168 T (p->a1x[2].a1[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
169 T (p->a1x[2].a1[DIFF_MAX - sizeof *p]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
170 T (p->a1x[2].a1[DIFF_MAX - sizeof *p + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
171 T (p->a1x[2].a1[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
172 | |
173 T (p->a1x[3].a1[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
174 T (p->a1x[3].a1[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
175 T (p->a1x[3].a1[0]); | |
176 T (p->a1x[3].a1[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
177 | |
178 T (p->a1x[9].a1[0]); | |
179 | |
180 enum { MAX = (DIFF_MAX - sizeof *p) / sizeof *p->a1x }; | |
181 | |
182 T (p->a1x[DIFF_MIN].a1); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
183 T (p->a1x[-1].a1); /* { dg-warning "array subscript -1 is below array bounds" } */ | |
184 T (p->a1x[MAX].a1); | |
185 T (p->a1x[MAX + 2].a1); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
186 | |
187 T (p->a1x[DIFF_MAX].a1); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
188 T (p->a1x[SIZE_MAX].a1); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
189 | |
190 T (p->a1x[DIFF_MIN].a1[0]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */ | |
191 T (p->a1x[-1].a1[0]) /* { dg-warning "array subscript -1 is below array bounds" } */; | |
192 T (p->a1x[MAX - 1].a1[0]); | |
193 T (p->a1x[MAX].a1[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
194 T (p->a1x[MAX + 1].a1[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
195 | |
196 T (p->a1x[DIFF_MAX].a1[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
197 T (p->a1x[SIZE_MAX].a1[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */ | |
198 } | |
199 | |
200 void f_cststring (int i) | |
201 { | |
202 T (""[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(const )?char *\\\[1]" "string" { xfail lp64 } } */ | |
203 T (""[DIFF_MIN + 1]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(const )?char *\\\[1]" "string" } */ | |
204 T (""[-1]); /* { dg-warning "array subscript -1 is below array bounds of .(const )?char *\\\[1]" "string" } */ | |
205 T (""[0]); | |
206 T (""[1]); /* { dg-warning "array subscript 1 is above array bounds of .(const )?char *\\\[1]" "string" } */ | |
207 T ("0"[2]); /* { dg-warning "array subscript 2 is above array bounds of .(const )?char *\\\[2]" "string" } */ | |
208 T ("012"[2]); | |
209 T ("012"[3]); | |
210 T ("012"[4]); /* { dg-warning "array subscript 4 is above array bounds of .(const )?char *\\\[4]" "string" } */ | |
211 T ("0123"[DIFF_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds of .(const )?char *\\\[5]" "string" } */ | |
212 T ("0123"[SIZE_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds of .(const )?char *\\\[5]" "string" } */ | |
213 } | |
214 | |
215 void fb_strlen (struct B *p) | |
216 { | |
217 #define strlen __builtin_strlen | |
218 | |
219 T (strlen (&p->a1x[0].a1[2])); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "strlen" } */ | |
220 T (strlen (p->a1x[0].a1 + 2)); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "strlen" { xfail *-*-* } } */ | |
221 } | |
222 | |
223 | |
224 void f_vla (unsigned n) | |
225 { | |
226 char vla[n]; | |
227 | |
228 T (vla[DIFF_MIN]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" "vla" } */ | |
229 T (vla[-1]); /* { dg-warning "array subscript -1 is below array bounds" "vla" } */ | |
230 T (vla[0]); | |
231 T (vla[1]); | |
232 T (vla[n - 1]); | |
233 /* It would be nice to diagnose this. */ | |
234 T (vla[n]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "bug 82608" { xfail *-*-*} } */ | |
235 T (vla[DIFF_MAX]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "vla" } */ | |
236 } |