1 /* PR middle-end/84725 - enable attribute nonstring for all narrow character
2    types
3    Verify that -Wstringop-truncation is issued for uses of arrays and
4    pointers to qualified forms of characters of all three types.
5    { dg-do compile }
6    { dg-options "-O2 -Wall -Wstringop-truncation -fno-ipa-icf" } */
7 
8 #if __cplusplus
9 extern "C"
10 #endif
11 char* strncpy (char*, const char*, __SIZE_TYPE__);
12 
13 #define S "1234"
14 
15 struct Arrays
16 {
17   char a[4];
18   signed char b[4];
19   unsigned char c[4];
20 };
21 
22 void test_arrays (struct Arrays *p, const char *s)
23 {
GetCocoaPrintInfo()24   /* Expect accesses to all three arrays to trigger the warning,
25      including the trailing one.  The size argument is a good
26      enough indication that it is not being used as a "legacy"
27      flexible array member.  */
28   strncpy (p->a, s, sizeof p->a);           /* { dg-warning "\\\[-Wstringop-truncation" } */
29   strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
30   strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
31 }
32 
33 struct Pointers
34 {
35   char *p;
36   signed char *q;
37   unsigned char *r;
38 };
39 
40 void test_pointers (struct Pointers *p)
41 {
42   strncpy (p->p, S, sizeof S - 1);          /* { dg-warning "\\\[-Wstringop-truncation" } */
43   strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
44   strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
45 }
46 
47 struct ConstArrays
48 {
49   const char a[4];
50   const signed char b[4];
51   const unsigned char c[4];
52 };
53 
54 void test_const_arrays (struct ConstArrays *p, const char *s)
55 {
56   /* Expect accesses to all three arrays to trigger the warning,
57      including the trailing one.  */
58   strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
59   strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
60   strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
61 }
62 
63 struct ConstPointers
64 {
65   const char *p;
66   const signed char *q;
67   const unsigned char *r;
68 };
69 
70 void test_const_pointers (struct ConstPointers *p)
71 {
72   strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
73   strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
74   strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
75 }
76 
77 struct VolatileArrays
78 {
79   volatile char a[4];
80   volatile signed char b[4];
81   volatile unsigned char c[4];
82 };
83 
84 void test_volatile_arrays (struct VolatileArrays *p, const char *s)
85 {
86   /* Expect accesses to all three arrays to trigger the warning,
87      including the trailing one.  */
88   strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
89   strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
90   strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
91 }
92 
93 struct VolatilePointers
94 {
95   volatile char *p;
96   volatile signed char *q;
97   volatile unsigned char *r;
98 };
99 
100 void test_volatile_pointers (struct VolatilePointers *p)
101 {
102   strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
103   strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
104   strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
105 }
106 
107 struct ConstVolatileArrays
108 {
109   const volatile char a[4];
110   const volatile signed char b[4];
111   const volatile unsigned char c[4];
112 };
113 
114 void test_const_volatile_arrays (struct ConstVolatileArrays *p, const char *s)
115 {
116   /* Expect accesses to all three arrays to trigger the warning,
117      including the trailing one.  */
118   strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
119   strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
120   strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
121 }
122 
123 struct ConstVolatilePointers
124 {
125   const volatile char *p;
126   const volatile signed char *q;
127   const volatile unsigned char *r;
128 };
129 
130 void test_const_volatile_pointers (struct ConstVolatilePointers *p)
131 {
132   strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
133   strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
134   strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
135 }
136 
137 /* { dg-prune-output "-Wdiscarded-qualifiers" } */
138