| /* 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" } */ |