1 /* This file was miscompiled by an earlier version of the object size
2 checking patch. Object size in one of the memcpy calls was
3 incorrectly determined to be 0 while it should be (size_t) -1
5 /* { dg-do compile } */
6 /* { dg-options "-O2" } */
8 #include "../gcc.c-torture/execute/builtins/chk.h"
11 extern void *malloc (__SIZE_TYPE__);
18 /* Here all object sizes are not known at compile time. There
19 should be no warning, nor any checker functions called. */
22 foo (const struct A *x, int y, const unsigned char *z)
27 b = (x->i & 0xff) == 1 ? 3 : 4;
29 c = bar (x->j * x->k);
31 const unsigned char *d = z;
33 unsigned char *f = c + x->j * x->k;
38 unsigned int h = *d++;
75 /* The same routine, slightly modified:
76 1) c has known size at compile time
77 2) e += h was changed into e += 16.
78 GCC could actually through VRP determine that
79 in e += h is (h >= 0 && h <= 127), thus know
80 it is pointer addition and not subtraction and
81 know e's __builtin_object_size (e, 0) is at 512,
82 but we are not there yet. */
85 baz (const struct A *x, const unsigned char *z)
90 b = (x->i & 0xff) == 1 ? 3 : 4;
93 const unsigned char *d = z;
95 unsigned char *f = c + x->j * x->k;
100 unsigned int h = *d++;
118 memcpy (e, d, 513); /* { dg-warning "will always overflow" "memcpy" } */