annotate gcc/testsuite/c-c++-common/Wstringop-truncation.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* PR middle-end/81117 - Improve buffer overflow checking in strncpy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 { dg-options "-O2 -Wstringop-truncation -Wno-stringop-overflow -ftrack-macro-expansion=0" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 { dg-require-effective-target alloca } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 typedef __SIZE_TYPE__ size_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 #if __cplusplus
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 extern "C" {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 size_t strlen (const char*);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 char* strncat (char*, const char*, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 char* strncpy (char*, const char*, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 #if __cplusplus
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 static size_t unsigned_value (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 extern volatile size_t unsigned_value_source;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 return unsigned_value_source;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 static size_t unsigned_range (size_t min, size_t max)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 size_t val = unsigned_value ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 return val < min || max < val ? min : val;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 #define UR(min, max) unsigned_range (min, max)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 void sink (void*);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 #define S4 "123"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 const char a4[] = "123";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 #define CHOOSE(a, b) (unsigned_value () & 1 ? a : b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 typedef struct Dest
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 char a5[5];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 char b7[7];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 char c3ns[3] __attribute__ ((nonstring));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 } Dest;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 char dst7[7];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 char dst2_5[2][5];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 /* Verify strncat warnings for arrays of known bounds. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 void test_strncat_array (Dest *pd)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 #define CAT(d, s, len) (strncat ((d), (s), (len)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 CAT (dst7, S4, 2); /* { dg-warning "output truncated copying 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 CAT (dst7, a4, 1); /* { dg-warning "output truncated copying 1 byte from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 /* There is no truncation here but possible overflow so these
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 are diagnosed by -Wstringop-overflow:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 CAT (dst7, S4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 CAT (dst7, a4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 CAT (pd->a5, S4, 2); /* { dg-warning "output truncated copying 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 CAT (pd->a5, S4, 1); /* { dg-warning "output truncated copying 1 byte from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 /* Verify strncat warnings for arrays of known bounds and a non-const
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 character count in some range. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 void test_strncat_array_range (Dest *pd)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 CAT (dst7, S4, UR (0, 1)); /* { dg-warning "output truncated copying between 0 and 1 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 CAT (dst7, S4, UR (0, 2)); /* { dg-warning "output truncated copying between 0 and 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 CAT (dst7, S4, UR (1, 3)); /* { dg-warning "output truncated copying between 1 and 3 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 CAT (dst7, S4, UR (2, 4)); /* { dg-warning "output may be truncated copying between 2 and 4 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 CAT (dst7, S4, UR (0, 7));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 CAT (dst7, S4, UR (1, 7));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 CAT (dst7, S4, UR (6, 7));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 CAT (dst7, S4, UR (0, 99));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 CAT (dst7, S4, UR (0, 99));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 /* Verify strncat warnings for arrays of unknown bounds. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 void test_strncat_vla (char *d, unsigned n)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 CAT (d, S4, 2); /* { dg-warning "output truncated copying 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 CAT (d, S4, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 CAT (d, a4, 2); /* { dg-warning "output truncated copying 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 /* There is no truncation here but possible overflow so these
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 are diagnosed by -Wstringop-overflow:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 CAT (d, S4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 CAT (d, a4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 CAT (d, a4, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 char vla[n];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 CAT (vla, S4, 2); /* { dg-warning "output truncated copying 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 CAT (vla, S4, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 CAT (vla, S4, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 CAT (vla, a4, 2); /* { dg-warning "output truncated copying 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 CAT (vla, a4, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 CAT (vla, a4, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 CAT (d, vla, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 CAT (d, vla, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 CAT (d, vla, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 CAT (d, vla, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 /* There is no truncation here but possible overflow so these
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 are diagnosed by -Wstringop-overflow:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 CAT (vla, S4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 CAT (vla, a4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 /* Verify strncpy warnings with at least one pointer to an object
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 or string of unknown size (destination) or length (source). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 void test_strncpy_ptr (char *d, const char* s, const char *t, int i)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 #define CPY(d, s, len) (strncpy ((d), (s), (len)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 /* Strncpy doesn't nul-terminate so the following is diagnosed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 CPY (d, "", 0); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 CPY (d, s, 0); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 /* This is safe. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 CPY (d, "", 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 CPY (d, "", 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 /* This could be safe. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 CPY (d, s, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 CPY (d, s, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 /* Truncation. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 CPY (d, "123", 1); /* { dg-warning ".strncpy\[^\n\r\]* output truncated copying 1 byte from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 CPY (d, "123", 2); /* { dg-warning ".strncpy\[^\n\r\]* output truncated copying 2 bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 CPY (d, "123", 3); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying 3 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 CPY (d, "123", 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 CPY (d, "123", 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 CPY (d, S4, sizeof S4); /* Covered by -Wsizeof-pointer-memaccess. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 CPY (d, S4, sizeof S4 - 1); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying 3 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 CPY (d, a4, sizeof a4); /* Covered by -Wsizeof-pointer-memaccess. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 CPY (d, a4, sizeof a4 - 1); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying 3 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 CPY (d, a4, sizeof a4 - 3); /* { dg-warning ".strncpy\[^\n\r\]* output truncated copying 1 byte from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 CPY (d, a4, sizeof a4 - 4); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 CPY (d, S4, strlen (S4)); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying 3 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 /* Likely buggy but no truncation. Diagnosed by -Wstringop-overflow. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168 CPY (d, a4, strlen (a4) + 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 CPY (d, S4, strlen (S4) + i);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 CPY (d, a4, strlen (a4)); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying 3 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 /* As above, buggy but no evidence of truncation. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 CPY (d, S4, strlen (S4) + 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 CPY (d, CHOOSE ("", "1"), 0); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 CPY (d, CHOOSE ("1", "12"), 0); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178 CPY (d, CHOOSE ("", "1"), 1); /* { dg-warning ".strncpy\[^\n\r\]* output may be truncated copying 1 byte from a string of length 1" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 CPY (d, CHOOSE ("1", ""), 1); /* { dg-warning ".strncpy\[^\n\r\]* output may be truncated copying 1 byte from a string of length 1" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180 CPY (d, CHOOSE (s, "1"), 1); /* { dg-warning ".strncpy\[^\n\r\]* output may be truncated copying 1 byte from a string of length 1" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181 CPY (d, CHOOSE (s, t), 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 CPY (d, CHOOSE ("", "1"), 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184 CPY (d, CHOOSE ("1", ""), 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 CPY (d, CHOOSE ("1", "2"), 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 CPY (d, CHOOSE ("1", s), 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 CPY (d, CHOOSE (s, "1"), 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188 CPY (d, CHOOSE (s, t), 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 CPY (d, CHOOSE ("", "123"), 1); /* { dg-warning ".strncpy\[^\n\r\]* output may be truncated copying 1 byte from a string of length 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 CPY (d, CHOOSE ("1", "123"), 1); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying 1 byte from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192 CPY (d, CHOOSE ("12", "123"), 1); /* { dg-warning ".strncpy\[^\n\r\]* output truncated copying 1 byte from a string of length 2" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193 CPY (d, CHOOSE ("123", "12"), 1); /* { dg-warning ".strncpy\[^\n\r\]* output truncated copying 1 byte from a string of length 2" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 signed char n = strlen (s); /* { dg-message "length computed here" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 CPY (d, s, n); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying as many bytes from a string as its length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201 short n = strlen (s); /* { dg-message "length computed here" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202 CPY (d, s, n); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying as many bytes from a string as its length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206 int n = strlen (s); /* { dg-message "length computed here" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207 CPY (d, s, n); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying as many bytes from a string as its length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211 unsigned n = strlen (s); /* { dg-message "length computed here" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 CPY (d, s, n); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying as many bytes from a string as its length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216 size_t n;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 n = strlen (s); /* { dg-message "length computed here" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218 CPY (d, s, n); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying as many bytes from a string as its length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222 size_t n;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223 char *dp2 = d + 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224 n = strlen (s); /* { dg-message "length computed here" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225 CPY (dp2, s, n); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying as many bytes from a string as its length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 /* The following is likely buggy but there's no apparent truncation
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230 so it's not diagnosed by -Wstringop-truncation. Instead, it is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231 diagnosed by -Wstringop-overflow (tested elsewhere). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232 int n;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233 n = strlen (s) - 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 CPY (d, s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238 /* Same as above. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239 size_t n;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240 n = strlen (s) - 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 CPY (d, s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 size_t n = strlen (s) - strlen (s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246 CPY (d, s, n); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250 /* This use of strncpy is dubious but it's probably not worth
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251 worrying about (truncation may not actually take place when
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 i is the result). It is diagnosed with -Wstringop-overflow
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253 (although more by accident than by design).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255 size_t n = i < strlen (s) ? i : strlen (s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256 CPY (d, s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262 /* Verify strncpy warnings for arrays of known bounds. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
264 void test_strncpy_array (Dest *pd, int i, const char* s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
265 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
266 #undef CPY
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
267 #define CPY(d, s, len) (strncpy ((d), (s), (len)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
268
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
269 CPY (dst7, s, 7); /* { dg-warning "specified bound 7 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
270 CPY (dst7, s, sizeof dst7); /* { dg-warning "specified bound 7 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
271
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
272 CPY (dst2_5[0], s, sizeof dst2_5[0]); /* { dg-warning "specified bound 5 equals destination size" "bug 77293" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
273 CPY (dst2_5[1], s, sizeof dst2_5[1]); /* { dg-warning "specified bound 5 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
274
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
275 /* Verify that copies that nul-terminate are not diagnosed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
276 CPY (dst7, "", sizeof dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
277 CPY (dst7 + 6, "", sizeof dst7 - 6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
278 CPY (dst7, "1", sizeof dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
279 CPY (dst7 + 1, "1", sizeof dst7 - 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
280 CPY (dst7, "123456", sizeof dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
281 CPY (dst7 + 1, "12345", sizeof dst7 - 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
282
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
283 CPY (dst7 + i, s, 6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
284 CPY (dst7 + i, s, 7); /* { dg-warning "specified bound 7 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
285 /* The following two calls are diagnosed by -Wstringop-overflow. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
286 CPY (dst7 + i, s, 8);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
287 CPY (dst7 + i, s, UR (8, 9));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
288
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
289 /* No nul-termination here. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
290 CPY (dst7 + 2, "12345", sizeof dst7 - 2); /* { dg-warning "output truncated before terminating nul copying 5 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
291
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
292 /* Because strnlen appends as many NULs as necessary to write the specified
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
293 number of byts the following doesn't (necessarily) truncate but rather
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
294 overflow, and so is diagnosed by -Wstringop-overflow. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
295 CPY (dst7, s, 8);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
296
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
297 CPY (dst7 + 1, s, 6); /* { dg-warning "specified bound 6 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
298 CPY (dst7 + 6, s, 1); /* { dg-warning "specified bound 1 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
299
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
300 CPY (pd->a5, s, 5); /* { dg-warning "specified bound 5 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
301 CPY (pd->a5, s, sizeof pd->a5); /* { dg-warning "specified bound 5 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
302
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
303 /* The following is not yet handled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
304 CPY (pd->a5 + i, s, sizeof pd->a5); /* { dg-warning "specified bound 5 equals destination size" "member array" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
305
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
306 /* Verify that a copy that nul-terminates is not diagnosed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
307 CPY (pd->a5, "1234", sizeof pd->a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309 /* Same above, diagnosed by -Wstringop-overflow. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
310 CPY (pd->a5, s, 6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
311
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
312 /* Exercise destination with attribute "nonstring". */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
313 CPY (pd->c3ns, "", 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
314 CPY (pd->c3ns, "", 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
315 /* It could be argued that truncation in the literal case should be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
316 diagnosed even for non-strings. Using strncpy in this case is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
317 pointless and should be replaced with memcpy. But it would likely
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
318 be viewed as a false positive. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
319 CPY (pd->c3ns, "12", 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
320 CPY (pd->c3ns, "12", 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
321 CPY (pd->c3ns, "12", 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
322 CPY (pd->c3ns, "123", 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
323 CPY (pd->c3ns, s, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
324 CPY (pd->c3ns, s, sizeof pd->c3ns);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
325
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
326 /* Verify that the idiom of calling strncpy with a bound equal to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
327 the size of the destination (and thus potentially without NUL-
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
328 terminating it) immediately followed by setting the last element
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
329 of the array to NUL is not diagnosed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
330 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
331 /* This might be better written using memcpy() but it's safe so
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
332 it probably shouldn't be diagnosed. It currently triggers
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
333 a warning because of bug 81704. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
334 strncpy (dst7, "0123456", sizeof dst7); /* { dg-bogus "\\\[-Wstringop-truncation]" "bug 81704" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
335 dst7[sizeof dst7 - 1] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
336 sink (dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
337 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
338
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
339 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
340 const char a[] = "0123456789";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
341 strncpy (dst7, a, sizeof dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
342 dst7[sizeof dst7 - 1] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
343 sink (dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
344 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
345
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
346 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
347 strncpy (dst7, s, sizeof dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
348 dst7[sizeof dst7 - 1] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
349 sink (dst7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
350 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
351
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
352 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
353 strncpy (pd->a5, "01234", sizeof pd->a5); /* { dg-bogus "\\\[-Wstringop-truncation]" "bug 81704" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
354 pd->a5[sizeof pd->a5 - 1] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
355 sink (pd);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
356 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
357
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
358 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
359 strncpy (pd->a5, s, sizeof pd->a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
360 pd->a5[sizeof pd->a5 - 1] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
361 sink (pd);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
362 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
363
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
364 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
365 unsigned n = 7;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
366 char *p = (char*)__builtin_malloc (n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
367 strncpy (p, s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
368 p[n - 1] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
369 sink (p);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
370 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
371
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
372 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
373 /* This should be diagnosed because the NUL-termination doesn't
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
374 immediately follow the strncpy call (sink may expect pd->a5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
375 to be NUL-terminated). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
376 strncpy (pd->a5, s, sizeof pd->a5); /* { dg-warning "specified bound 5 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
377 sink (pd);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
378 pd->a5[sizeof pd->a5] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
379 sink (pd);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
380 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
381 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
382
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
383 typedef struct Flex
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
384 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
385 size_t n;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
386 char a0[0];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
387 char ax[];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
388 } Flex;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
389
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
390 extern char array[];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
391
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
392 /* Verify that no warning is issued for array of unknown bound, flexible
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
393 array members, or zero-length arrays, except when the source is definitely
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
394 truncated. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
395
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
396 void test_strncpy_flexarray (Flex *pf, const char* s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
397 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
398 #undef CPY
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
399 #define CPY(d, s, len) (strncpy ((d), (s), (len)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
400
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
401 CPY (array, "12345", 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
402 CPY (array, "12345", 123);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
403
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
404 CPY (array, s, 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
405 CPY (array, s, 123);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
406
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
407 CPY (pf->a0, s, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
408 CPY (pf->a0, s, 1234);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
409
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
410 CPY (pf->a0, "", 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
411 CPY (pf->a0, "12345", 5); /* { dg-warning "output truncated before terminating nul copying 5 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
412 CPY (pf->a0, "12345", 1234);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
413
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
414 CPY (pf->ax, s, 5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
415 CPY (pf->ax, s, 12345);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
416
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
417 CPY (pf->ax, "1234", 5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
418 CPY (pf->ax, "12345", 5); /* { dg-warning "output truncated before terminating nul copying 5 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
419 CPY (pf->ax, "12345", 12345);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
420 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
421
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
422 /* Verify warnings for dynamically allocated objects. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
423
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
424 void test_strncpy_alloc (const char* s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
425 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
426 size_t n = 7;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
427 char *d = (char *)__builtin_malloc (n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
428
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
429 CPY (d, s, n); /* { dg-warning "specified bound 7 equals destination size" "bug 79016" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
430
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
431 Dest *pd = (Dest *)__builtin_malloc (sizeof *pd * n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
432 CPY (pd->a5, s, 5); /* { dg-warning "specified bound 5 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
433 CPY (pd->a5, s, sizeof pd->a5); /* { dg-warning "specified bound 5 equals destination size" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
434 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
435
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
436 /* Verify warnings for VLAs. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
437
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
438 void test_strncpy_vla (unsigned n, const char* s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
439 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
440 char vla[n];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
441 CPY (vla, s, 0); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
442
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
443 CPY (vla, s, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
444 CPY (vla, s, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
445 CPY (vla, s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
446
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
447 CPY (vla, "", 0); /* { dg-warning ".strncpy\[^\n\r\]* destination unchanged after copying no bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
448 CPY (vla, "", 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
449 CPY (vla, S4, 3); /* { dg-warning ".strncpy\[^\n\r\]* output truncated before terminating nul copying 3 bytes from a string of the same length" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
450 CPY (vla, S4, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
451 }