1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/* 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" } */
|