2 /* { dg-options "-O2 -Wno-stringop-overread" } */
3 /* { dg-require-effective-target alloca } */
4 /* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
6 #include "builtin-object-size-common.h"
17 extern struct A zerol
[0];
20 __attribute__ ((noinline
))
21 test1 (void *q
, int x
)
24 void *p
= &a
.a
[3], *r
;
30 if (__builtin_object_size (p
, 0)
31 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 3)
33 if (__builtin_object_size (&a
.c
[9], 0)
34 != sizeof (a
) - __builtin_offsetof (struct A
, c
) - 9)
36 if (__builtin_object_size (q
, 0) != (size_t) -1)
38 #ifdef __builtin_object_size
39 if (__builtin_object_size (r
, 0)
41 ? sizeof (a
) - __builtin_offsetof (struct A
, a
) - 9
42 : sizeof (a
) - __builtin_offsetof (struct A
, c
) - 1))
45 if (__builtin_object_size (r
, 0)
46 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 9)
53 if (__builtin_object_size (&y
, 0)
56 if (__builtin_object_size (w
, 0)
59 if (__builtin_object_size (&y
.b
, 0)
60 != sizeof (a
) - __builtin_offsetof (struct A
, b
))
62 #ifdef __builtin_object_size
63 if (__builtin_object_size (r
, 0)
65 ? 2 * sizeof (w
[0]) - __builtin_offsetof (struct A
, a
) - 1
66 : sizeof (a
) - __builtin_offsetof (struct A
, a
) - 6))
69 if (__builtin_object_size (r
, 0)
70 != 2 * sizeof (w
[0]) - __builtin_offsetof (struct A
, a
) - 1)
77 #ifdef __builtin_object_size
78 if (__builtin_object_size (r
, 0) != (x
< 20 ? 30 : 2 * 16))
81 /* We may duplicate this test onto the two exit paths. On one path
82 the size will be 32, the other it will be 30. If we don't duplicate
83 this test, then the size will be 32. */
84 if (__builtin_object_size (r
, 0) != 2 * 16
85 && __builtin_object_size (r
, 0) != 30)
92 #ifdef __builtin_object_size
93 if (__builtin_object_size (r
, 0) != (x
< 20 ? 30 : 2 * 14))
96 if (__builtin_object_size (r
, 0) != 30)
100 r
= malloc (sizeof (a
));
103 #ifdef __builtin_object_size
104 if (__builtin_object_size (r
, 0) != (x
< 30 ? sizeof (a
) : sizeof (a
) - 3))
107 if (__builtin_object_size (r
, 0) != sizeof (a
))
110 r
= memcpy (r
, "a", 2);
111 #ifdef __builtin_object_size
112 if (__builtin_object_size (r
, 0) != (x
< 30 ? sizeof (a
) : sizeof (a
) - 3))
115 if (__builtin_object_size (r
, 0) != sizeof (a
))
118 r
= memcpy (r
+ 2, "b", 2) + 2;
119 #ifdef __builtin_object_size
120 if (__builtin_object_size (r
, 0)
121 != (x
< 30 ? sizeof (a
) - 4 : sizeof (a
) - 7))
124 if (__builtin_object_size (r
, 0) != sizeof (a
) - 4)
128 r
= memset (r
, 'a', 2);
129 if (__builtin_object_size (r
, 0)
130 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 4)
132 r
= memset (r
+ 2, 'b', 2) + 2;
133 if (__builtin_object_size (r
, 0)
134 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 8)
137 r
= strcpy (r
, "ab");
138 if (__builtin_object_size (r
, 0)
139 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 1)
141 r
= strcpy (r
+ 2, "cd") + 2;
142 if (__builtin_object_size (r
, 0)
143 != sizeof (a
) - __builtin_offsetof (struct A
, a
) - 5)
145 if (__builtin_object_size (exta
, 0) != (size_t) -1)
147 if (__builtin_object_size (exta
+ 10, 0) != (size_t) -1)
149 if (__builtin_object_size (&exta
[5], 0) != (size_t) -1)
151 if (__builtin_object_size (extb
, 0) != sizeof (extb
))
153 if (__builtin_object_size (extb
+ 10, 0) != sizeof (extb
) - 10)
155 if (__builtin_object_size (&extb
[5], 0) != sizeof (extb
) - 5)
157 #ifdef __builtin_object_size
158 if (__builtin_object_size (var
, 0) != x
+ 10)
160 if (__builtin_object_size (var
+ 10, 0) != x
)
162 if (__builtin_object_size (&var
[5], 0) != x
+ 5)
165 if (__builtin_object_size (var
, 0) != (size_t) -1)
167 if (__builtin_object_size (var
+ 10, 0) != (size_t) -1)
169 if (__builtin_object_size (&var
[5], 0) != (size_t) -1)
172 if (__builtin_object_size (zerol
, 0) != 0)
174 if (__builtin_object_size (&zerol
, 0) != 0)
176 if (__builtin_object_size (&zerol
[0], 0) != 0)
178 if (__builtin_object_size (zerol
[0].a
, 0) != 0)
180 if (__builtin_object_size (&zerol
[0].a
[0], 0) != 0)
182 if (__builtin_object_size (&zerol
[0].b
, 0) != 0)
184 if (__builtin_object_size ("abcdefg", 0) != sizeof ("abcdefg"))
186 if (__builtin_object_size ("abcd\0efg", 0) != sizeof ("abcd\0efg"))
188 if (__builtin_object_size (&"abcd\0efg", 0) != sizeof ("abcd\0efg"))
190 if (__builtin_object_size (&"abcd\0efg"[0], 0) != sizeof ("abcd\0efg"))
192 if (__builtin_object_size (&"abcd\0efg"[4], 0) != sizeof ("abcd\0efg") - 4)
194 if (__builtin_object_size ("abcd\0efg" + 5, 0) != sizeof ("abcd\0efg") - 5)
196 if (__builtin_object_size (L
"abcdefg", 0) != sizeof (L
"abcdefg"))
198 r
= (char *) L
"abcd\0efg";
199 if (__builtin_object_size (r
+ 2, 0) != sizeof (L
"abcd\0efg") - 2)
206 __attribute__ ((noinline
))
209 struct B
{ char buf1
[10]; char buf2
[10]; } a
;
214 if (sizeof (a
) != 20)
218 for (i
= 0; i
< 4; ++i
)
224 else if (i
== l1
+ 1)
226 else if (i
== l1
+ 2)
229 #ifdef __builtin_object_size
232 for (i
= 0; i
< 4; ++i
)
235 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 1;
237 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf2
) - 7;
238 else if (i
== l1
+ 1)
239 res
= sizeof (buf3
) - 5;
240 else if (i
== l1
+ 2)
241 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 9;
246 if (__builtin_object_size (r
, 0) != res
)
249 for (i
= 0; i
< 4; ++i
)
255 else if (i
== l1
+ 1)
257 else if (i
== l1
+ 2)
260 #ifdef __builtin_object_size
261 res
= sizeof (buf3
) - 20;
263 for (i
= 0; i
< 4; ++i
)
266 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 7;
268 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf2
) - 7;
269 else if (i
== l1
+ 1)
270 res
= sizeof (buf3
) - 5;
271 else if (i
== l1
+ 2)
272 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 9;
274 if (__builtin_object_size (r
, 0) != res
)
279 if (__builtin_object_size (r
, 0) != res
)
282 #ifdef __builtin_object_size
284 if (__builtin_object_size (r
, 0) != res
)
288 if (__builtin_object_size (r
+ 6, 0) != res
- 6)
291 else if (__builtin_object_size (r
+ 6, 0) != 0)
294 if (__builtin_object_size (r
, 0) != 7)
296 if (__builtin_object_size (r
+ 6, 0) != 1)
300 for (i
= 0; i
< 4; ++i
)
306 else if (i
== l1
+ 1)
308 else if (i
== l1
+ 2)
311 #ifdef __builtin_object_size
312 res
= sizeof (buf3
) - 18;
314 for (i
= 0; i
< 4; ++i
)
317 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 9;
319 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf2
) - 9;
320 else if (i
== l1
+ 1)
321 res
= sizeof (buf3
) - 5;
322 else if (i
== l1
+ 2)
323 res
= sizeof (a
) - __builtin_offsetof (struct B
, buf1
) - 4;
327 if (__builtin_object_size (r
+ 12, 0) != res
- 12)
330 else if (__builtin_object_size (r
+ 12, 0) != 0)
333 if (__builtin_object_size (r
+ 12, 0) != 4)
339 __attribute__ ((noinline
))
343 struct B
{ struct A a
[2]; struct A b
; char c
[4]; char d
; double e
;
344 _Complex
double f
; } x
;
349 if (__builtin_object_size (buf4
, 0) != sizeof (buf4
))
351 if (__builtin_object_size (&buf4
, 0) != sizeof (buf4
))
353 if (__builtin_object_size (&buf4
[0], 0) != sizeof (buf4
))
355 if (__builtin_object_size (&buf4
[1], 0) != sizeof (buf4
) - 1)
357 if (__builtin_object_size (&x
, 0) != sizeof (x
))
359 if (__builtin_object_size (&x
.a
, 0) != sizeof (x
))
361 if (__builtin_object_size (&x
.a
[0], 0) != sizeof (x
))
363 if (__builtin_object_size (&x
.a
[0].a
, 0) != sizeof (x
))
365 if (__builtin_object_size (&x
.a
[0].a
[0], 0) != sizeof (x
))
367 if (__builtin_object_size (&x
.a
[0].a
[3], 0) != sizeof (x
) - 3)
369 if (__builtin_object_size (&x
.a
[0].b
, 0)
370 != sizeof (x
) - __builtin_offsetof (struct A
, b
))
372 if (__builtin_object_size (&x
.a
[1].c
, 0)
373 != sizeof (x
) - sizeof (struct A
) - __builtin_offsetof (struct A
, c
))
375 if (__builtin_object_size (&x
.a
[1].c
[0], 0)
376 != sizeof (x
) - sizeof (struct A
) - __builtin_offsetof (struct A
, c
))
378 if (__builtin_object_size (&x
.a
[1].c
[3], 0)
379 != sizeof (x
) - sizeof (struct A
) - __builtin_offsetof (struct A
, c
) - 3)
381 if (__builtin_object_size (&x
.b
, 0)
382 != sizeof (x
) - __builtin_offsetof (struct B
, b
))
384 if (__builtin_object_size (&x
.b
.a
, 0)
385 != sizeof (x
) - __builtin_offsetof (struct B
, b
))
387 if (__builtin_object_size (&x
.b
.a
[0], 0)
388 != sizeof (x
) - __builtin_offsetof (struct B
, b
))
390 if (__builtin_object_size (&x
.b
.a
[3], 0)
391 != sizeof (x
) - __builtin_offsetof (struct B
, b
) - 3)
393 if (__builtin_object_size (&x
.b
.b
, 0)
394 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
395 - __builtin_offsetof (struct A
, b
))
397 if (__builtin_object_size (&x
.b
.c
, 0)
398 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
399 - __builtin_offsetof (struct A
, c
))
401 if (__builtin_object_size (&x
.b
.c
[0], 0)
402 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
403 - __builtin_offsetof (struct A
, c
))
405 if (__builtin_object_size (&x
.b
.c
[3], 0)
406 != sizeof (x
) - __builtin_offsetof (struct B
, b
)
407 - __builtin_offsetof (struct A
, c
) - 3)
409 if (__builtin_object_size (&x
.c
, 0)
410 != sizeof (x
) - __builtin_offsetof (struct B
, c
))
412 if (__builtin_object_size (&x
.c
[0], 0)
413 != sizeof (x
) - __builtin_offsetof (struct B
, c
))
415 if (__builtin_object_size (&x
.c
[1], 0)
416 != sizeof (x
) - __builtin_offsetof (struct B
, c
) - 1)
418 if (__builtin_object_size (&x
.d
, 0)
419 != sizeof (x
) - __builtin_offsetof (struct B
, d
))
421 if (__builtin_object_size (&x
.e
, 0)
422 != sizeof (x
) - __builtin_offsetof (struct B
, e
))
424 if (__builtin_object_size (&x
.f
, 0)
425 != sizeof (x
) - __builtin_offsetof (struct B
, f
))
428 if (__builtin_object_size (dp
, 0)
429 != sizeof (x
) - __builtin_offsetof (struct B
, f
))
432 if (__builtin_object_size (dp
, 0)
433 != sizeof (x
) - __builtin_offsetof (struct B
, f
)
437 if (__builtin_object_size (dp
, 0) != sizeof (y
))
439 if (__builtin_object_size (&z
, 0) != sizeof (z
))
442 if (__builtin_object_size (dp
, 0) != sizeof (z
))
445 if (__builtin_object_size (dp
, 0) != sizeof (z
) / 2)
449 struct S
{ unsigned int a
; };
452 __attribute__ ((noinline
))
453 test4 (char *x
, int y
)
458 for (i
= 0; i
< y
; i
++)
462 if (__builtin_object_size (p
, 0) != (size_t) -1)
469 __attribute__ ((noinline
))
476 for (i
= 0; i
< x
; ++i
)
478 #ifdef __builtin_object_size
479 if (__builtin_object_size (p
, 0) != sizeof (buf
) - 8 - 4 * x
)
482 /* My understanding of ISO C99 6.5.6 is that a conforming
483 program will not end up with p equal to &buf[0]
484 through &buf[7], i.e. calling this function with say
485 UINTPTR_MAX / 4 results in undefined behavior.
486 If that's true, then the maximum number of remaining
487 bytes from p until end of the object is 56, otherwise
488 it would be 64 (or conservative (size_t) -1 == unknown). */
489 if (__builtin_object_size (p
, 0) != sizeof (buf
) - 8)
492 memset (p
, ' ', sizeof (buf
) - 8 - 4 * 4);
496 __attribute__ ((noinline
))
499 struct T
{ char buf
[64]; char buf2
[64]; } t
;
503 for (i
= 0; i
< x
; ++i
)
505 #ifdef __builtin_object_size
506 if (__builtin_object_size (p
, 0) != sizeof (t
) - 8 - 4 * x
)
509 if (__builtin_object_size (p
, 0) != sizeof (t
) - 8)
512 memset (p
, ' ', sizeof (t
) - 8 - 4 * 4);
516 __attribute__ ((noinline
))
520 struct T
{ char buf
[64]; char buf2
[64]; } t
;
521 char *p
= &buf
[64], *q
= &t
.buf
[64];
523 if (__builtin_object_size (p
+ 64, 0) != 0)
525 if (__builtin_object_size (q
+ 63, 0) != sizeof (t
) - 64 - 63)
527 if (__builtin_object_size (q
+ 64, 0) != sizeof (t
) - 64 - 64)
529 if (__builtin_object_size (q
+ 256, 0) != 0)
534 __attribute__ ((noinline
))
537 struct T
{ char buf
[10]; char buf2
[10]; } t
;
538 char *p
= &t
.buf2
[-4];
539 char *q
= &t
.buf2
[0];
540 if (__builtin_object_size (p
, 0) != sizeof (t
) - 10 + 4)
542 if (__builtin_object_size (q
, 0) != sizeof (t
) - 10)
544 /* GCC only handles additions, not subtractions. */
546 if (__builtin_object_size (q
, 0) != (size_t) -1
547 && __builtin_object_size (q
, 0) != sizeof (t
) - 10 + 8)
550 if (__builtin_object_size (p
, 0) != 0)
555 __attribute__ ((noinline
))
556 test9 (unsigned cond
)
558 char *buf2
= malloc (10);
566 #ifdef __builtin_object_size
567 if (__builtin_object_size (&p
[-4], 0) != (cond
? 6 : 10))
570 if (__builtin_object_size (&p
[-4], 0) != 10)
574 for (unsigned i
= cond
; i
> 0; i
--)
577 #ifdef __builtin_object_size
578 if (__builtin_object_size (p
, 0) != ((cond
? 2 : 6) + cond
))
581 if (__builtin_object_size (p
, 0) != 10)
586 for (unsigned i
= cond
; i
> 0; i
--)
589 #ifdef __builtin_object_size
590 if (__builtin_object_size (p
, 0)
591 != sizeof (y
) - __builtin_offsetof (struct A
, c
) - 8 + cond
)
594 if (__builtin_object_size (p
, 0) != sizeof (y
))
600 __attribute__ ((noinline
))
603 static char buf
[255];
604 unsigned int i
, len
= sizeof (buf
);
607 for (i
= 0 ; i
< sizeof (buf
) ; i
++)
611 #ifdef __builtin_object_size
612 if (__builtin_object_size (p
- 3, 0) != sizeof (buf
) - i
+ 3)
615 if (__builtin_object_size (p
- 3, 0) != sizeof (buf
))
626 /* Tests for strdup/strndup. */
628 __attribute__ ((noinline
))
632 const char *ptr
= "abcdefghijklmnopqrstuvwxyz";
633 char *res
= strndup (ptr
, 21);
634 if (__builtin_object_size (res
, 0) != 22)
639 res
= strndup (ptr
, 32);
640 if (__builtin_object_size (res
, 0) != 27)
646 if (__builtin_object_size (res
, 0) != 27)
651 char *ptr2
= malloc (64);
654 res
= strndup (ptr2
, 21);
655 if (__builtin_object_size (res
, 0) != 22)
660 res
= strndup (ptr2
, 32);
661 if (__builtin_object_size (res
, 0) != 33)
666 res
= strndup (ptr2
, 128);
667 if (__builtin_object_size (res
, 0) != 64)
673 #ifdef __builtin_object_size
674 if (__builtin_object_size (res
, 0) != 27)
676 if (__builtin_object_size (res
, 0) != (size_t) -1)
682 ptr
= "abcd\0efghijklmnopqrstuvwxyz";
684 if (__builtin_object_size (res
, 0) != 5)
688 res
= strndup (ptr
, 24);
689 if (__builtin_object_size (res
, 0) != 5)
693 res
= strndup (ptr
, 2);
694 if (__builtin_object_size (res
, 0) != 3)
698 res
= strdup (&ptr
[4]);
699 if (__builtin_object_size (res
, 0) != 1)
703 res
= strndup (&ptr
[4], 4);
704 if (__builtin_object_size (res
, 0) != 1)
708 res
= strndup (&ptr
[4], 1);
709 if (__builtin_object_size (res
, 0) != 1)
719 __asm ("" : "=r" (l1
) : "0" (l1
));
723 test4 ((char *) s
, 10);