2 /* { dg-options "-O2 -Wno-stringop-overread" } */
3 /* { dg-require-effective-target alloca } */
5 #include "builtin-object-size-common.h"
16 extern struct A zerol
[0];
19 __attribute__ ((noinline
))
20 test1 (void *q
, int x
)
23 void *p
= &a
.a
[3], *r
;
29 if (__builtin_object_size (p
, 0)
30 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 3)
32 if (__builtin_object_size (&a
.c
[9], 0)
33 != sizeof (a
) - __builtin_offsetof (struct A
, c
) - 9)
35 if (__builtin_object_size (q
, 0) != (size_t) -1)
37 #ifdef __builtin_object_size
38 if (__builtin_object_size (r
, 0)
40 ? sizeof (a
) - __builtin_offsetof (struct A
, a
) - 9
41 : sizeof (a
) - __builtin_offsetof (struct A
, c
) - 1))
44 if (__builtin_object_size (r
, 0)
45 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 9)
52 if (__builtin_object_size (&y
, 0)
55 if (__builtin_object_size (w
, 0)
58 if (__builtin_object_size (&y
.b
, 0)
59 != sizeof (a
) - __builtin_offsetof (struct A
, b
))
61 #ifdef __builtin_object_size
62 if (__builtin_object_size (r
, 0)
64 ? 2 * sizeof (w
[0]) - __builtin_offsetof (struct A
, a
) - 1
65 : sizeof (a
) - __builtin_offsetof (struct A
, a
) - 6))
68 if (__builtin_object_size (r
, 0)
69 != 2 * sizeof (w
[0]) - __builtin_offsetof (struct A
, a
) - 1)
76 #ifdef __builtin_object_size
77 if (__builtin_object_size (r
, 0) != (x
< 20 ? 30 : 2 * 16))
80 /* We may duplicate this test onto the two exit paths. On one path
81 the size will be 32, the other it will be 30. If we don't duplicate
82 this test, then the size will be 32. */
83 if (__builtin_object_size (r
, 0) != 2 * 16
84 && __builtin_object_size (r
, 0) != 30)
91 #ifdef __builtin_object_size
92 if (__builtin_object_size (r
, 0) != (x
< 20 ? 30 : 2 * 14))
95 if (__builtin_object_size (r
, 0) != 30)
99 r
= malloc (sizeof (a
));
102 #ifdef __builtin_object_size
103 if (__builtin_object_size (r
, 0) != (x
< 30 ? sizeof (a
) : sizeof (a
) - 3))
106 if (__builtin_object_size (r
, 0) != sizeof (a
))
109 r
= memcpy (r
, "a", 2);
110 #ifdef __builtin_object_size
111 if (__builtin_object_size (r
, 0) != (x
< 30 ? sizeof (a
) : sizeof (a
) - 3))
114 if (__builtin_object_size (r
, 0) != sizeof (a
))
117 r
= memcpy (r
+ 2, "b", 2) + 2;
118 #ifdef __builtin_object_size
119 if (__builtin_object_size (r
, 0)
120 != (x
< 30 ? sizeof (a
) - 4 : sizeof (a
) - 7))
123 if (__builtin_object_size (r
, 0) != sizeof (a
) - 4)
127 r
= memset (r
, 'a', 2);
128 if (__builtin_object_size (r
, 0)
129 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 4)
131 r
= memset (r
+ 2, 'b', 2) + 2;
132 if (__builtin_object_size (r
, 0)
133 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 8)
136 r
= strcpy (r
, "ab");
137 if (__builtin_object_size (r
, 0)
138 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 1)
140 r
= strcpy (r
+ 2, "cd") + 2;
141 if (__builtin_object_size (r
, 0)
142 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 5)
144 if (__builtin_object_size (exta
, 0) != (size_t) -1)
146 if (__builtin_object_size (exta
+ 10, 0) != (size_t) -1)
148 if (__builtin_object_size (&exta
[5], 0) != (size_t) -1)
150 if (__builtin_object_size (extb
, 0) != sizeof (extb
))
152 if (__builtin_object_size (extb
+ 10, 0) != sizeof (extb
) - 10)
154 if (__builtin_object_size (&extb
[5], 0) != sizeof (extb
) - 5)
156 #ifdef __builtin_object_size
157 if (__builtin_object_size (var
, 0) != x
+ 10)
159 if (__builtin_object_size (var
+ 10, 0) != x
)
161 if (__builtin_object_size (&var
[5], 0) != x
+ 5)
164 if (__builtin_object_size (var
, 0) != (size_t) -1)
166 if (__builtin_object_size (var
+ 10, 0) != (size_t) -1)
168 if (__builtin_object_size (&var
[5], 0) != (size_t) -1)
171 if (__builtin_object_size (zerol
, 0) != 0)
173 if (__builtin_object_size (&zerol
, 0) != 0)
175 if (__builtin_object_size (&zerol
[0], 0) != 0)
177 if (__builtin_object_size (zerol
[0].a
, 0) != 0)
179 if (__builtin_object_size (&zerol
[0].a
[0], 0) != 0)
181 if (__builtin_object_size (&zerol
[0].b
, 0) != 0)
183 if (__builtin_object_size ("abcdefg", 0) != sizeof ("abcdefg"))
185 if (__builtin_object_size ("abcd\0efg", 0) != sizeof ("abcd\0efg"))
187 if (__builtin_object_size (&"abcd\0efg", 0) != sizeof ("abcd\0efg"))
189 if (__builtin_object_size (&"abcd\0efg"[0], 0) != sizeof ("abcd\0efg"))
191 if (__builtin_object_size (&"abcd\0efg"[4], 0) != sizeof ("abcd\0efg") - 4)
193 if (__builtin_object_size ("abcd\0efg" + 5, 0) != sizeof ("abcd\0efg") - 5)
195 if (__builtin_object_size (L
"abcdefg", 0) != sizeof (L
"abcdefg"))
197 r
= (char *) L
"abcd\0efg";
198 if (__builtin_object_size (r
+ 2, 0) != sizeof (L
"abcd\0efg") - 2)
205 __attribute__ ((noinline
))
208 struct B
{ char buf1
[10]; char buf2
[10]; } a
;
213 if (sizeof (a
) != 20)
217 for (i
= 0; i
< 4; ++i
)
223 else if (i
== l1
+ 1)
225 else if (i
== l1
+ 2)
228 #ifdef __builtin_object_size
231 for (i
= 0; i
< 4; ++i
)
234 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 1;
236 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf2
) - 7;
237 else if (i
== l1
+ 1)
238 res
= sizeof (buf3
) - 5;
239 else if (i
== l1
+ 2)
240 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 9;
245 if (__builtin_object_size (r
, 0) != res
)
248 for (i
= 0; i
< 4; ++i
)
254 else if (i
== l1
+ 1)
256 else if (i
== l1
+ 2)
259 #ifdef __builtin_object_size
260 res
= sizeof (buf3
) - 20;
262 for (i
= 0; i
< 4; ++i
)
265 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 7;
267 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf2
) - 7;
268 else if (i
== l1
+ 1)
269 res
= sizeof (buf3
) - 5;
270 else if (i
== l1
+ 2)
271 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 9;
273 if (__builtin_object_size (r
, 0) != res
)
278 if (__builtin_object_size (r
, 0) != res
)
281 #ifdef __builtin_object_size
283 if (__builtin_object_size (r
, 0) != res
)
287 if (__builtin_object_size (r
+ 6, 0) != res
- 6)
290 else if (__builtin_object_size (r
+ 6, 0) != 0)
293 if (__builtin_object_size (r
, 0) != 7)
295 if (__builtin_object_size (r
+ 6, 0) != 1)
299 for (i
= 0; i
< 4; ++i
)
305 else if (i
== l1
+ 1)
307 else if (i
== l1
+ 2)
310 #ifdef __builtin_object_size
311 res
= sizeof (buf3
) - 18;
313 for (i
= 0; i
< 4; ++i
)
316 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 9;
318 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf2
) - 9;
319 else if (i
== l1
+ 1)
320 res
= sizeof (buf3
) - 5;
321 else if (i
== l1
+ 2)
322 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 4;
326 if (__builtin_object_size (r
+ 12, 0) != res
- 12)
329 else if (__builtin_object_size (r
+ 12, 0) != 0)
332 if (__builtin_object_size (r
+ 12, 0) != 4)
338 __attribute__ ((noinline
))
342 struct B
{ struct A a
[2]; struct A b
; char c
[4]; char d
; double e
;
343 _Complex
double f
; } x
;
348 if (__builtin_object_size (buf4
, 0) != sizeof (buf4
))
350 if (__builtin_object_size (&buf4
, 0) != sizeof (buf4
))
352 if (__builtin_object_size (&buf4
[0], 0) != sizeof (buf4
))
354 if (__builtin_object_size (&buf4
[1], 0) != sizeof (buf4
) - 1)
356 if (__builtin_object_size (&x
, 0) != sizeof (x
))
358 if (__builtin_object_size (&x
.a
, 0) != sizeof (x
))
360 if (__builtin_object_size (&x
.a
[0], 0) != sizeof (x
))
362 if (__builtin_object_size (&x
.a
[0].a
, 0) != sizeof (x
))
364 if (__builtin_object_size (&x
.a
[0].a
[0], 0) != sizeof (x
))
366 if (__builtin_object_size (&x
.a
[0].a
[3], 0) != sizeof (x
) - 3)
368 if (__builtin_object_size (&x
.a
[0].b
, 0)
369 != sizeof (x
) - __builtin_offsetof (struct A
, b
))
371 if (__builtin_object_size (&x
.a
[1].c
, 0)
372 != sizeof (x
) - sizeof (struct A
) - __builtin_offsetof (struct A
, c
))
374 if (__builtin_object_size (&x
.a
[1].c
[0], 0)
375 != sizeof (x
) - sizeof (struct A
) - __builtin_offsetof (struct A
, c
))
377 if (__builtin_object_size (&x
.a
[1].c
[3], 0)
378 != sizeof (x
) - sizeof (struct A
) - __builtin_offsetof (struct A
, c
) - 3)
380 if (__builtin_object_size (&x
.b
, 0)
381 != sizeof (x
) - __builtin_offsetof (struct B
, b
))
383 if (__builtin_object_size (&x
.b
.a
, 0)
384 != sizeof (x
) - __builtin_offsetof (struct B
, b
))
386 if (__builtin_object_size (&x
.b
.a
[0], 0)
387 != sizeof (x
) - __builtin_offsetof (struct B
, b
))
389 if (__builtin_object_size (&x
.b
.a
[3], 0)
390 != sizeof (x
) - __builtin_offsetof (struct B
, b
) - 3)
392 if (__builtin_object_size (&x
.b
.b
, 0)
393 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
394 - __builtin_offsetof (struct A
, b
))
396 if (__builtin_object_size (&x
.b
.c
, 0)
397 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
398 - __builtin_offsetof (struct A
, c
))
400 if (__builtin_object_size (&x
.b
.c
[0], 0)
401 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
402 - __builtin_offsetof (struct A
, c
))
404 if (__builtin_object_size (&x
.b
.c
[3], 0)
405 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
406 - __builtin_offsetof (struct A
, c
) - 3)
408 if (__builtin_object_size (&x
.c
, 0)
409 != sizeof (x
) - __builtin_offsetof (struct B
, c
))
411 if (__builtin_object_size (&x
.c
[0], 0)
412 != sizeof (x
) - __builtin_offsetof (struct B
, c
))
414 if (__builtin_object_size (&x
.c
[1], 0)
415 != sizeof (x
) - __builtin_offsetof (struct B
, c
) - 1)
417 if (__builtin_object_size (&x
.d
, 0)
418 != sizeof (x
) - __builtin_offsetof (struct B
, d
))
420 if (__builtin_object_size (&x
.e
, 0)
421 != sizeof (x
) - __builtin_offsetof (struct B
, e
))
423 if (__builtin_object_size (&x
.f
, 0)
424 != sizeof (x
) - __builtin_offsetof (struct B
, f
))
427 if (__builtin_object_size (dp
, 0)
428 != sizeof (x
) - __builtin_offsetof (struct B
, f
))
431 if (__builtin_object_size (dp
, 0)
432 != sizeof (x
) - __builtin_offsetof (struct B
, f
)
436 if (__builtin_object_size (dp
, 0) != sizeof (y
))
438 if (__builtin_object_size (&z
, 0) != sizeof (z
))
441 if (__builtin_object_size (dp
, 0) != sizeof (z
))
444 if (__builtin_object_size (dp
, 0) != sizeof (z
) / 2)
448 struct S
{ unsigned int a
; };
451 __attribute__ ((noinline
))
452 test4 (char *x
, int y
)
457 for (i
= 0; i
< y
; i
++)
461 if (__builtin_object_size (p
, 0) != (size_t) -1)
468 __attribute__ ((noinline
))
475 for (i
= 0; i
< x
; ++i
)
477 #ifdef __builtin_object_size
478 if (__builtin_object_size (p
, 0) != sizeof (buf
) - 8 - 4 * x
)
481 /* My understanding of ISO C99 6.5.6 is that a conforming
482 program will not end up with p equal to &buf[0]
483 through &buf[7], i.e. calling this function with say
484 UINTPTR_MAX / 4 results in undefined behavior.
485 If that's true, then the maximum number of remaining
486 bytes from p until end of the object is 56, otherwise
487 it would be 64 (or conservative (size_t) -1 == unknown). */
488 if (__builtin_object_size (p
, 0) != sizeof (buf
) - 8)
491 memset (p
, ' ', sizeof (buf
) - 8 - 4 * 4);
495 __attribute__ ((noinline
))
498 struct T
{ char buf
[64]; char buf2
[64]; } t
;
502 for (i
= 0; i
< x
; ++i
)
504 #ifdef __builtin_object_size
505 if (__builtin_object_size (p
, 0) != sizeof (t
) - 8 - 4 * x
)
508 if (__builtin_object_size (p
, 0) != sizeof (t
) - 8)
511 memset (p
, ' ', sizeof (t
) - 8 - 4 * 4);
515 __attribute__ ((noinline
))
519 struct T
{ char buf
[64]; char buf2
[64]; } t
;
520 char *p
= &buf
[64], *q
= &t
.buf
[64];
522 if (__builtin_object_size (p
+ 64, 0) != 0)
524 if (__builtin_object_size (q
+ 63, 0) != sizeof (t
) - 64 - 63)
526 if (__builtin_object_size (q
+ 64, 0) != sizeof (t
) - 64 - 64)
528 if (__builtin_object_size (q
+ 256, 0) != 0)
533 __attribute__ ((noinline
))
536 struct T
{ char buf
[10]; char buf2
[10]; } t
;
537 char *p
= &t
.buf2
[-4];
538 char *q
= &t
.buf2
[0];
539 if (__builtin_object_size (p
, 0) != sizeof (t
) - 10 + 4)
541 if (__builtin_object_size (q
, 0) != sizeof (t
) - 10)
543 /* GCC only handles additions, not subtractions. */
545 if (__builtin_object_size (q
, 0) != (size_t) -1
546 && __builtin_object_size (q
, 0) != sizeof (t
) - 10 + 8)
549 if (__builtin_object_size (p
, 0) != 0)
554 __attribute__ ((noinline
))
555 test9 (unsigned cond
)
557 char *buf2
= malloc (10);
565 #ifdef __builtin_object_size
566 if (__builtin_object_size (&p
[-4], 0) != (cond
? 6 : 10))
569 if (__builtin_object_size (&p
[-4], 0) != 10)
573 for (unsigned i
= cond
; i
> 0; i
--)
576 #ifdef __builtin_object_size
577 if (__builtin_object_size (p
, 0) != ((cond
? 2 : 6) + cond
))
580 if (__builtin_object_size (p
, 0) != 10)
585 for (unsigned i
= cond
; i
> 0; i
--)
588 #ifdef __builtin_object_size
589 if (__builtin_object_size (p
, 0)
590 != sizeof (y
) - __builtin_offsetof (struct A
, c
) - 8 + cond
)
593 if (__builtin_object_size (p
, 0) != sizeof (y
))
599 __attribute__ ((noinline
))
602 static char buf
[255];
603 unsigned int i
, len
= sizeof (buf
);
606 for (i
= 0 ; i
< sizeof (buf
) ; i
++)
610 #ifdef __builtin_object_size
611 if (__builtin_object_size (p
- 3, 0) != sizeof (buf
) - i
+ 3)
614 if (__builtin_object_size (p
- 3, 0) != sizeof (buf
))
624 #if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
625 /* Tests for strdup/strndup. */
627 __attribute__ ((noinline
))
631 const char *ptr
= "abcdefghijklmnopqrstuvwxyz";
632 char *res
= strndup (ptr
, 21);
633 if (__builtin_object_size (res
, 0) != 22)
638 res
= strndup (ptr
, 32);
639 if (__builtin_object_size (res
, 0) != 27)
645 if (__builtin_object_size (res
, 0) != 27)
650 char *ptr2
= malloc (64);
653 res
= strndup (ptr2
, 21);
654 if (__builtin_object_size (res
, 0) != 22)
659 res
= strndup (ptr2
, 32);
660 if (__builtin_object_size (res
, 0) != 33)
665 res
= strndup (ptr2
, 128);
666 if (__builtin_object_size (res
, 0) != 64)
672 #ifdef __builtin_object_size
673 if (__builtin_object_size (res
, 0) != 27)
675 if (__builtin_object_size (res
, 0) != (size_t) -1)
681 ptr
= "abcd\0efghijklmnopqrstuvwxyz";
683 if (__builtin_object_size (res
, 0) != 5)
687 res
= strndup (ptr
, 24);
688 if (__builtin_object_size (res
, 0) != 5)
692 res
= strndup (ptr
, 2);
693 if (__builtin_object_size (res
, 0) != 3)
697 res
= strdup (&ptr
[4]);
698 if (__builtin_object_size (res
, 0) != 1)
702 res
= strndup (&ptr
[4], 4);
703 if (__builtin_object_size (res
, 0) != 1)
707 res
= strndup (&ptr
[4], 1);
708 if (__builtin_object_size (res
, 0) != 1)
718 __asm ("" : "=r" (l1
) : "0" (l1
));
722 test4 ((char *) s
, 10);
729 #if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */