95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
/* 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\]+ " }
|
|
}
|