blob: 12bda2b31a73c464f185ade50bda85c9319ce4cf [file] [log] [blame]
/* Verify that non-constant offsets don't suppress warnings in cases
when the size of the access alone makes it invalid, regardless of
the offset value.
Also verify that writing into unknown objects through pointers
(or pointer members) doesn't trigger warnings.
{ dg-do compile }
{ dg-options "-O1 -Wall -Wno-array-bounds" } */
typedef __SIZE_TYPE__ size_t;
extern void* memcpy (void*, const void*, size_t);
extern void* memset (void*, int, size_t);
struct Xp { char *p; } xp;
struct Xa { char *a[2]; } xa;
void nowarn_copy_read_pointed_obj_plus_cst (void *d)
{
int i = 0;
memcpy (d, xp.p + i, 9);
memcpy (d, xa.a[i], 9);
}
void nowarn_copy_read_pointed_obj_plus_var (void *d, int i)
{
memcpy (d, xp.p + i, 9);
memcpy (d, xa.a[i], 9);
}
void warn_copy_read_pointer_plus_cst (void *d)
{
int i = 0;
memcpy (d, &xp.p + i, 9); // { dg-warning "reading 9 bytes from a region of size . " }
}
void warn_copy_read_pointer_plus_var (void *d, int i)
{
memcpy (d, &xp.p + i, 9); // { dg-warning "reading 9 bytes from a region of size . " }
}
void nowarn_copy_write_pointed_obj_plus_cst (const void *s)
{
int i = 0;
memcpy (xp.p + i, s, 9);
memcpy (xa.a[i], s, 9);
}
void nowarn_copy_write_pointed_obj_plus_var (const void *s, int i)
{
memcpy (xp.p + i, s, 9);
memcpy (xa.a[i], s, 9);
}
void warn_copy_write_pointer_plus_cst (const void *s)
{
int i = 0;
memcpy (&xp.p + i, s, 9); // { dg-warning "writing 9 bytes into a region of size . " }
}
void warn_copy_write_pointer_plus_var (const void *s, int i)
{
memcpy (&xp.p + i, s, 9); // { dg-warning "writing 9 bytes into a region of size . " }
}
void nowarn_set_pointed_obj_plus_cst (void)
{
int i = 0;
memset (xp.p + i, 0, 9);
memset (xa.a[i], 0, 9);
}
void nowarn_set_pointed_obj_plus_var (int i)
{
memset (xp.p + i, 0, 9);
memset (xa.a[i], 0, 9);
}
void warn_set_pointer_plus_cst (void)
{
int i = 0;
memset (&xp.p + i, 0, 9); // { dg-warning "writing 9 bytes into a region of size . " }
}
void warn_set_pointer_plus_var (int i)
{
memset (&xp.p + i, 0, 9); // { dg-warning "writing 9 bytes into a region of size . " }
memset (&xa.a[i], 0, 17); // { dg-warning "writing 17 bytes into a region of size \[0-9\]+ " }
}