view gcc/testsuite/c-c++-common/Wstringop-truncation-4.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
line wrap: on
line source

/* PR middle-end/84725 - enable attribute nonstring for all narrow character
   types
   Verify that -Wstringop-truncation is issued for uses of arrays and
   pointers to qualified forms of characters of all three types.
   { dg-do compile }
   { dg-options "-O2 -Wall -Wstringop-truncation -fno-ipa-icf" } */

#if __cplusplus
extern "C"
#endif
char* strncpy (char*, const char*, __SIZE_TYPE__);

#define S "1234"

struct Arrays
{
  char a[4];
  signed char b[4];
  unsigned char c[4];
};

void test_arrays (struct Arrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  The size argument is a good
     enough indication that it is not being used as a "legacy"
     flexible array member.  */
  strncpy (p->a, s, sizeof p->a);           /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct Pointers
{
  char *p;
  signed char *q;
  unsigned char *r;
};

void test_pointers (struct Pointers *p)
{
  strncpy (p->p, S, sizeof S - 1);          /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstArrays
{
  const char a[4];
  const signed char b[4];
  const unsigned char c[4];
};

void test_const_arrays (struct ConstArrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  */
  strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstPointers
{
  const char *p;
  const signed char *q;
  const unsigned char *r;
};

void test_const_pointers (struct ConstPointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct VolatileArrays
{
  volatile char a[4];
  volatile signed char b[4];
  volatile unsigned char c[4];
};

void test_volatile_arrays (struct VolatileArrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  */
  strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct VolatilePointers
{
  volatile char *p;
  volatile signed char *q;
  volatile unsigned char *r;
};

void test_volatile_pointers (struct VolatilePointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstVolatileArrays
{
  const volatile char a[4];
  const volatile signed char b[4];
  const volatile unsigned char c[4];
};

void test_const_volatile_arrays (struct ConstVolatileArrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  */
  strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstVolatilePointers
{
  const volatile char *p;
  const volatile signed char *q;
  const volatile unsigned char *r;
};

void test_const_volatile_pointers (struct ConstVolatilePointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

/* { dg-prune-output "-Wdiscarded-qualifiers" } */