blob: d9a1555e7ce9ac9ed765bbcd603fd0ba06d3db37 [file] [log] [blame]
/* Test -Wsizeof-pointer-memaccess warnings. */
/* { dg-do compile } */
/* { dg-options "-Wall -O2 -Wno-array-bounds -Wno-sizeof-array-argument -Wno-stringop-truncation -ftrack-macro-expansion=0" } */
/* { dg-options "-Wall -O2 -Wno-array-bounds -Wno-sizeof-array-argument -Wno-stringop-truncation -Wno-c++-compat -ftrack-macro-expansion=0" {target c} } */
/* { dg-require-effective-target alloca } */
#define bos(ptr) __builtin_object_size (ptr, 1)
#define bos0(ptr) __builtin_object_size (ptr, 0)
#define memset(dst, val, sz) __builtin___memset_chk (dst, val, sz, bos (dst))
#define memcpy(dst, src, sz) __builtin___memcpy_chk (dst, src, sz, bos (dst))
#define memmove(dst, src, sz) __builtin___memmove_chk (dst, src, sz, bos (dst))
#define strncpy(dst, src, sz) __builtin___strncpy_chk (dst, src, sz, bos (dst))
#define strncat(dst, src, sz) __builtin___strncat_chk (dst, src, sz, bos (dst))
#define stpncpy(dst, src, sz) __builtin___stpncpy_chk (dst, src, sz, bos (dst))
struct A { short a, b; int c, d; long e, f; };
typedef struct A TA;
typedef struct A *PA;
typedef TA *PTA;
struct B {};
typedef struct B TB;
typedef struct B *PB;
typedef TB *PTB;
typedef int X[3][3][3];
void
f1 (void *x)
{
struct A a, *pa1 = &a;
TA *pa2 = &a;
PA pa3 = &a;
PTA pa4 = &a;
memset (&a, 0, sizeof (&a)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memset (pa1, 0, sizeof (pa1)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pa2, 0, sizeof pa2); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pa3, 0, sizeof (pa3)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pa4, 0, sizeof pa4); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pa1, 0, sizeof (struct A *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memset (pa2, 0, sizeof (PTA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memset (pa3, 0, sizeof (PA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memset (pa4, 0, sizeof (__typeof (pa4))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (&a, x, sizeof (&a)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memcpy (pa1, x, sizeof (pa1)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pa2, x, sizeof pa2); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pa3, x, sizeof (pa3)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pa4, x, sizeof pa4); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pa1, x, sizeof (struct A *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (pa2, x, sizeof (PTA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (pa3, x, sizeof (PA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (pa4, x, sizeof (__typeof (pa4))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, &a, sizeof (&a)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
memcpy (x, pa1, sizeof (pa1)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pa2, sizeof pa2); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pa3, sizeof (pa3)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pa4, sizeof pa4); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pa1, sizeof (struct A *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, pa2, sizeof (PTA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, pa3, sizeof (PA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, pa4, sizeof (__typeof (pa4))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (&a, x, sizeof (&a)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memmove (pa1, x, sizeof (pa1)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pa2, x, sizeof pa2); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pa3, x, sizeof (pa3)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pa4, x, sizeof pa4); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pa1, x, sizeof (struct A *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (pa2, x, sizeof (PTA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (pa3, x, sizeof (PA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (pa4, x, sizeof (__typeof (pa4)));/* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (x, &a, sizeof (&a)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
memmove (x, pa1, sizeof (pa1)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pa2, sizeof pa2); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pa3, sizeof (pa3)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pa4, sizeof pa4); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pa1, sizeof (struct A *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (x, pa2, sizeof (PTA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (x, pa3, sizeof (PA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (x, pa4, sizeof (__typeof (pa4)));/* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
/* These are correct, no warning. */
memset (&a, 0, sizeof a);
memset (&a, 0, sizeof (a));
memset (&a, 0, sizeof (struct A));
memset (&a, 0, sizeof (const struct A));
memset (&a, 0, sizeof (volatile struct A));
memset (&a, 0, sizeof (volatile const struct A));
memset (&a, 0, sizeof (TA));
memset (&a, 0, sizeof (__typeof (*&a)));
memset (pa1, 0, sizeof (*pa1));
memset (pa2, 0, sizeof (*pa3));
memset (pa3, 0, sizeof (__typeof (*pa3)));
/* These are probably broken, but obfuscated, no warning. */
memset ((void *) &a, 0, sizeof (&a));
memset ((char *) &a, 0, sizeof (&a));
memset (&a, 0, sizeof (&a) + 0);
memset (&a, 0, 0 + sizeof (&a));
/* These are correct, no warning. */
memcpy (&a, x, sizeof a);
memcpy (&a, x, sizeof (a));
memcpy (&a, x, sizeof (struct A));
memcpy (&a, x, sizeof (const struct A));
memcpy (&a, x, sizeof (volatile struct A));
memcpy (&a, x, sizeof (volatile const struct A));
memcpy (&a, x, sizeof (TA));
memcpy (&a, x, sizeof (__typeof (*&a)));
memcpy (pa1, x, sizeof (*pa1));
memcpy (pa2, x, sizeof (*pa3));
memcpy (pa3, x, sizeof (__typeof (*pa3)));
/* These are probably broken, but obfuscated, no warning. */
memcpy ((void *) &a, x, sizeof (&a));
memcpy ((char *) &a, x, sizeof (&a));
memcpy (&a, x, sizeof (&a) + 0);
memcpy (&a, x, 0 + sizeof (&a));
/* These are correct, no warning. */
memcpy (x, &a, sizeof a);
memcpy (x, &a, sizeof (a));
memcpy (x, &a, sizeof (struct A));
memcpy (x, &a, sizeof (const struct A));
memcpy (x, &a, sizeof (volatile struct A));
memcpy (x, &a, sizeof (volatile const struct A));
memcpy (x, &a, sizeof (TA));
memcpy (x, &a, sizeof (__typeof (*&a)));
memcpy (x, pa1, sizeof (*pa1));
memcpy (x, pa2, sizeof (*pa3));
memcpy (x, pa3, sizeof (__typeof (*pa3)));
/* These are probably broken, but obfuscated, no warning. */
memcpy (x, (void *) &a, sizeof (&a));
memcpy (x, (char *) &a, sizeof (&a));
memcpy (x, &a, sizeof (&a) + 0);
memcpy (x, &a, 0 + sizeof (&a));
/* These are correct, no warning. */
memmove (&a, x, sizeof a);
memmove (&a, x, sizeof (a));
memmove (&a, x, sizeof (struct A));
memmove (&a, x, sizeof (const struct A));
memmove (&a, x, sizeof (volatile struct A));
memmove (&a, x, sizeof (volatile const struct A));
memmove (&a, x, sizeof (TA));
memmove (&a, x, sizeof (__typeof (*&a)));
memmove (pa1, x, sizeof (*pa1));
memmove (pa2, x, sizeof (*pa3));
memmove (pa3, x, sizeof (__typeof (*pa3)));
/* These are probably broken, but obfuscated, no warning. */
memmove ((void *) &a, x, sizeof (&a));
memmove ((char *) &a, x, sizeof (&a));
memmove (&a, x, sizeof (&a) + 0);
memmove (&a, x, 0 + sizeof (&a));
/* These are correct, no warning. */
memmove (x, &a, sizeof a);
memmove (x, &a, sizeof (a));
memmove (x, &a, sizeof (struct A));
memmove (x, &a, sizeof (const struct A));
memmove (x, &a, sizeof (volatile struct A));
memmove (x, &a, sizeof (volatile const struct A));
memmove (x, &a, sizeof (TA));
memmove (x, &a, sizeof (__typeof (*&a)));
memmove (x, pa1, sizeof (*pa1));
memmove (x, pa2, sizeof (*pa3));
memmove (x, pa3, sizeof (__typeof (*pa3)));
/* These are probably broken, but obfuscated, no warning. */
memmove (x, (void *) &a, sizeof (&a));
memmove (x, (char *) &a, sizeof (&a));
memmove (x, &a, sizeof (&a) + 0);
memmove (x, &a, 0 + sizeof (&a));
}
void
f2 (void *x)
{
struct B b, *pb1 = &b;
TB *pb2 = &b;
PB pb3 = &b;
PTB pb4 = &b;
memset (&b, 0, sizeof (&b)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memset (pb1, 0, sizeof (pb1)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pb2, 0, sizeof pb2); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pb3, 0, sizeof (pb3)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pb4, 0, sizeof pb4); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memset (pb1, 0, sizeof (struct B *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memset (pb2, 0, sizeof (PTB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memset (pb3, 0, sizeof (PB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memset (pb4, 0, sizeof (__typeof (pb4))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (&b, x, sizeof (&b)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memcpy (pb1, x, sizeof (pb1)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pb2, x, sizeof pb2); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pb3, x, sizeof (pb3)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pb4, x, sizeof pb4); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (pb1, x, sizeof (struct B *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (pb2, x, sizeof (PTB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (pb3, x, sizeof (PB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (pb4, x, sizeof (__typeof (pb4))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, &b, sizeof (&b)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
memcpy (x, pb1, sizeof (pb1)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pb2, sizeof pb2); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pb3, sizeof (pb3)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pb4, sizeof pb4); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memcpy (x, pb1, sizeof (struct B *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, pb2, sizeof (PTB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, pb3, sizeof (PB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memcpy (x, pb4, sizeof (__typeof (pb4))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (&b, x, sizeof (&b)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memmove (pb1, x, sizeof (pb1)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pb2, x, sizeof pb2); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pb3, x, sizeof (pb3)); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pb4, x, sizeof pb4); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (pb1, x, sizeof (struct B *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (pb2, x, sizeof (PTB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (pb3, x, sizeof (PB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (pb4, x, sizeof (__typeof (pb4)));/* { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" } */
memmove (x, &b, sizeof (&b)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
memmove (x, pb1, sizeof (pb1)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pb2, sizeof pb2); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pb3, sizeof (pb3)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pb4, sizeof pb4); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (x, pb1, sizeof (struct B *)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (x, pb2, sizeof (PTB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (x, pb3, sizeof (PB)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
memmove (x, pb4, sizeof (__typeof (pb4)));/* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
/* These are correct, no warning. */
memset (&b, 0, sizeof b);
memset (&b, 0, sizeof (b));
memset (&b, 0, sizeof (struct B));
memset (&b, 0, sizeof (const struct B));
memset (&b, 0, sizeof (volatile struct B));
memset (&b, 0, sizeof (volatile const struct B));
memset (&b, 0, sizeof (TB));
memset (&b, 0, sizeof (__typeof (*&b)));
memset (pb1, 0, sizeof (*pb1));
memset (pb2, 0, sizeof (*pb3));
memset (pb3, 0, sizeof (__typeof (*pb3)));
/* These are probably broken, but obfuscated, no warning. */
memset ((void *) &b, 0, sizeof (&b));
memset ((char *) &b, 0, sizeof (&b));
memset (&b, 0, sizeof (&b) + 0);
memset (&b, 0, 0 + sizeof (&b));
/* These are correct, no warning. */
memcpy (&b, x, sizeof b);
memcpy (&b, x, sizeof (b));
memcpy (&b, x, sizeof (struct B));
memcpy (&b, x, sizeof (const struct B));
memcpy (&b, x, sizeof (volatile struct B));
memcpy (&b, x, sizeof (volatile const struct B));
memcpy (&b, x, sizeof (TB));
memcpy (&b, x, sizeof (__typeof (*&b)));
memcpy (pb1, x, sizeof (*pb1));
memcpy (pb2, x, sizeof (*pb3));
memcpy (pb3, x, sizeof (__typeof (*pb3)));
/* These are probably broken, but obfuscated, no warning. */
memcpy ((void *) &b, x, sizeof (&b));
memcpy ((char *) &b, x, sizeof (&b));
memcpy (&b, x, sizeof (&b) + 0);
memcpy (&b, x, 0 + sizeof (&b));
/* These are correct, no warning. */
memcpy (x, &b, sizeof b);
memcpy (x, &b, sizeof (b));
memcpy (x, &b, sizeof (struct B));
memcpy (x, &b, sizeof (const struct B));
memcpy (x, &b, sizeof (volatile struct B));
memcpy (x, &b, sizeof (volatile const struct B));
memcpy (x, &b, sizeof (TB));
memcpy (x, &b, sizeof (__typeof (*&b)));
memcpy (x, pb1, sizeof (*pb1));
memcpy (x, pb2, sizeof (*pb3));
memcpy (x, pb3, sizeof (__typeof (*pb3)));
/* These are probably broken, but obfuscated, no warning. */
memcpy (x, (void *) &b, sizeof (&b));
memcpy (x, (char *) &b, sizeof (&b));
memcpy (x, &b, sizeof (&b) + 0);
memcpy (x, &b, 0 + sizeof (&b));
/* These are correct, no warning. */
memmove (&b, x, sizeof b);
memmove (&b, x, sizeof (b));
memmove (&b, x, sizeof (struct B));
memmove (&b, x, sizeof (const struct B));
memmove (&b, x, sizeof (volatile struct B));
memmove (&b, x, sizeof (volatile const struct B));
memmove (&b, x, sizeof (TB));
memmove (&b, x, sizeof (__typeof (*&b)));
memmove (pb1, x, sizeof (*pb1));
memmove (pb2, x, sizeof (*pb3));
memmove (pb3, x, sizeof (__typeof (*pb3)));
/* These are probably broken, but obfuscated, no warning. */
memmove ((void *) &b, x, sizeof (&b));
memmove ((char *) &b, x, sizeof (&b));
memmove (&b, x, sizeof (&b) + 0);
memmove (&b, x, 0 + sizeof (&b));
/* These are correct, no warning. */
memmove (x, &b, sizeof b);
memmove (x, &b, sizeof (b));
memmove (x, &b, sizeof (struct B));
memmove (x, &b, sizeof (const struct B));
memmove (x, &b, sizeof (volatile struct B));
memmove (x, &b, sizeof (volatile const struct B));
memmove (x, &b, sizeof (TB));
memmove (x, &b, sizeof (__typeof (*&b)));
memmove (x, pb1, sizeof (*pb1));
memmove (x, pb2, sizeof (*pb3));
memmove (x, pb3, sizeof (__typeof (*pb3)));
/* These are probably broken, but obfuscated, no warning. */
memmove (x, (void *) &b, sizeof (&b));
memmove (x, (char *) &b, sizeof (&b));
memmove (x, &b, sizeof (&b) + 0);
memmove (x, &b, 0 + sizeof (&b));
}
void
f3 (void *x, char *y, int z, X w)
{
unsigned char *y1 = (unsigned char *) __builtin_alloca (z + 16);
char buf1[7];
signed char buf2[z + 32];
long buf3[17];
int *buf4[9];
signed char *y2 = buf2;
char c;
char *y3;
memset (y, 0, sizeof (y)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memset (y1, 0, sizeof (y1)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memset (y2, 0, sizeof (y2)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memset (&c, 0, sizeof (&c)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memset (w, 0, sizeof w); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (y, x, sizeof (y)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memcpy (y1, x, sizeof (y1)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memcpy (y2, x, sizeof (y2)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memcpy (&c, x, sizeof (&c)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memcpy (w, x, sizeof w); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memcpy (x, y, sizeof (y)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
memcpy (x, y1, sizeof (y1)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
memcpy (x, y2, sizeof (y2)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
memcpy (x, &c, sizeof (&c)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
memcpy (x, w, sizeof w); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
memmove (y, x, sizeof (y)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memmove (y1, x, sizeof (y1)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memmove (y2, x, sizeof (y2)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
memmove (&c, x, sizeof (&c)); /* { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" } */
memmove (w, x, sizeof w); /* { dg-warning "call is the same expression as the destination; did you mean to dereference it" } */
memmove (x, y, sizeof (y)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
memmove (x, y1, sizeof (y1)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
memmove (x, y2, sizeof (y2)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
memmove (x, &c, sizeof (&c)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
memmove (x, w, sizeof w); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
/* These are correct, no warning. */
memset (y, 0, sizeof (*y));
memset (y1, 0, sizeof (*y2));
memset (buf1, 0, sizeof buf1);
memset (buf3, 0, sizeof (buf3));
memset (&buf3[0], 0, sizeof (buf3));
memset (&buf4[0], 0, sizeof (buf4));
memset (w, 0, sizeof (X));
/* These are probably broken, but obfuscated, no warning. */
memset ((void *) y, 0, sizeof (y));
memset ((char *) y1, 0, sizeof (y2));
memset (y, 0, sizeof (y) + 0);
memset (y1, 0, 0 + sizeof (y2));
memset ((void *) &c, 0, sizeof (&c));
memset ((signed char *) &c, 0, sizeof (&c));
memset (&c, 0, sizeof (&c) + 0);
memset (&c, 0, 0 + sizeof (&c));
/* These are correct, no warning. */
memcpy (y, x, sizeof (*y));
memcpy (y1, x, sizeof (*y2));
memcpy (buf1, x, sizeof buf1);
memcpy (buf3, x, sizeof (buf3));
memcpy (&buf3[0], x, sizeof (buf3));
memcpy (&buf4[0], x, sizeof (buf4));
memcpy (&y3, y, sizeof (y3));
memcpy ((char *) &y3, y, sizeof (y3));
memcpy (w, x, sizeof (X));
/* These are probably broken, but obfuscated, no warning. */
memcpy ((void *) y, x, sizeof (y));
memcpy ((char *) y1, x, sizeof (y2));
memcpy (y, x, sizeof (y) + 0);
memcpy (y1, x, 0 + sizeof (y2));
memcpy ((void *) &c, x, sizeof (&c));
memcpy ((signed char *) &c, x, sizeof (&c));
memcpy (&c, x, sizeof (&c) + 0);
memcpy (&c, x, 0 + sizeof (&c));
/* These are correct, no warning. */
memcpy (x, y, sizeof (*y));
memcpy (x, y1, sizeof (*y2));
memcpy (x, buf1, sizeof buf1);
memcpy (x, buf3, sizeof (buf3));
memcpy (x, &buf3[0], sizeof (buf3));
memcpy (x, &buf4[0], sizeof (buf4));
memcpy (y, &y3, sizeof (y3));
memcpy (y, (char *) &y3, sizeof (y3));
memcpy (x, w, sizeof (X));
/* These are probably broken, but obfuscated, no warning. */
memcpy (x, (void *) y, sizeof (y));
memcpy (x, (char *) y1, sizeof (y2));
memcpy (x, y, sizeof (y) + 0);
memcpy (x, y1, 0 + sizeof (y2));
memcpy (x, (void *) &c, sizeof (&c));
memcpy (x, (signed char *) &c, sizeof (&c));
memcpy (x, &c, sizeof (&c) + 0);
memcpy (x, &c, 0 + sizeof (&c));
/* These are correct, no warning. */
memmove (y, x, sizeof (*y));
memmove (y1, x, sizeof (*y2));
memmove (buf1, x, sizeof buf1);
memmove (buf3, x, sizeof (buf3));
memmove (&buf3[0], x, sizeof (buf3));
memmove (&buf4[0], x, sizeof (buf4));
memmove (&y3, y, sizeof (y3));
memmove ((char *) &y3, y, sizeof (y3));
memmove (w, x, sizeof (X));
/* These are probably broken, but obfuscated, no warning. */
memmove ((void *) y, x, sizeof (y));
memmove ((char *) y1, x, sizeof (y2));
memmove (y, x, sizeof (y) + 0);
memmove (y1, x, 0 + sizeof (y2));
memmove ((void *) &c, x, sizeof (&c));
memmove ((signed char *) &c, x, sizeof (&c));
memmove (&c, x, sizeof (&c) + 0);
memmove (&c, x, 0 + sizeof (&c));
/* These are correct, no warning. */
memmove (x, y, sizeof (*y));
memmove (x, y1, sizeof (*y2));
memmove (x, buf1, sizeof buf1);
memmove (x, buf3, sizeof (buf3));
memmove (x, &buf3[0], sizeof (buf3));
memmove (x, &buf4[0], sizeof (buf4));
memmove (y, &y3, sizeof (y3));
memmove (y, (char *) &y3, sizeof (y3));
memmove (x, w, sizeof (X));
/* These are probably broken, but obfuscated, no warning. */
memmove (x, (void *) y, sizeof (y));
memmove (x, (char *) y1, sizeof (y2));
memmove (x, y, sizeof (y) + 0);
memmove (x, y1, 0 + sizeof (y2));
memmove (x, (void *) &c, sizeof (&c));
memmove (x, (signed char *) &c, sizeof (&c));
memmove (x, &c, sizeof (&c) + 0);
memmove (x, &c, 0 + sizeof (&c));
}
void
f4 (char *x, char **y, int z, char w[64])
{
const char *s1 = "foobarbaz";
const char *s2 = "abcde12345678";
strncpy (x, s1, sizeof (s1)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
strncat (x, s2, sizeof (s2)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
stpncpy (x, s1, sizeof (s1)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
strncpy (w, s1, sizeof (w)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
strncat (w, s2, sizeof (w)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
stpncpy (w, s1, sizeof (w)); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
/* These are pointless when the destination is large enough, and
cause overflow otherwise. If the copies are guaranteed to be
safe the calls might as well be replaced by strcat(), strcpy(),
or memcpy(). */
const char s3[] = "foobarbaz";
const char s4[] = "abcde12345678";
strncpy (x, s3, sizeof (s3)); /* { dg-warning "call is the same expression as the source; did you mean to use the size of the destination?" } */
strncat (x, s4, sizeof (s4)); /* { dg-warning "call is the same expression as the source; did you mean to use the size of the destination?" } */
stpncpy (x, s3, sizeof (s3)); /* { dg-warning "call is the same expression as the source; did you mean to use the size of the destination?" } */
}
/* { dg-prune-output "\[\n\r\]*writing\[\n\r\]*" } */
/* { dg-prune-output "\[\n\r\]*reading\[\n\r\]*" } */