Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-11.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* PR middle-end/79275 - -Wformat-overflow false positive exceeding INT_MAX | |
2 in glibc sysdeps/posix/tempname.c | |
3 { dg-do compile } | |
4 { dg-options "-O2 -Wall -Wformat-overflow=1 -ftrack-macro-expansion=0" } */ | |
5 | |
6 typedef __SIZE_TYPE__ size_t; | |
7 typedef __WCHAR_TYPE__ wchar_t; | |
8 | |
9 #define INT_MAX __INT_MAX__ | |
10 #define INT_MIN (-INT_MAX - 1) | |
11 | |
12 /* When debugging, define LINE to the line number of the test case to exercise | |
13 and avoid exercising any of the others. The buffer and objsize macros | |
14 below make use of LINE to avoid warnings for other lines. */ | |
15 #ifndef LINE | |
16 # define LINE 0 | |
17 #endif | |
18 | |
19 extern int int_value (void); | |
20 extern size_t size_value (void); | |
21 | |
22 int int_range (int min, int max) | |
23 { | |
24 int n = int_value (); | |
25 return n < min || max < n ? min : n; | |
26 } | |
27 | |
28 size_t size_range (size_t min, size_t max) | |
29 { | |
30 size_t n = size_value (); | |
31 return n < min || max < n ? min : n; | |
32 } | |
33 | |
34 void sink (char*, char*); | |
35 | |
36 int dummy_sprintf (char*, const char*, ...); | |
37 | |
38 char buffer [256]; | |
39 extern char *ptr; | |
40 | |
41 const char s0[] = ""; | |
42 const char s1[] = "1"; | |
43 const char s2[] = "12"; | |
44 const char s3[] = "123"; | |
45 const char s4[] = "1234"; | |
46 const char s5[] = "12345"; | |
47 const char s6[] = "123456"; | |
48 const char s7[] = "1234567"; | |
49 const char s8[] = "12345678"; | |
50 const char s9[] = "123456789"; | |
51 extern const char sx[]; | |
52 extern const char sy[]; | |
53 | |
54 /* Wide string literals outside the ASCII range to avoid assumptions | |
55 about the number of narrow characters they might convert to beyond | |
56 up to 6 bytes each (the maximum for UTF-8 not exceeded by any known | |
57 encoding). */ | |
58 const wchar_t ws0[] = L""; | |
59 const wchar_t ws1[] = L"\u1111"; | |
60 const wchar_t ws2[] = L"\u1111\u2222"; | |
61 const wchar_t ws3[] = L"\u1111\u2222\u3333"; | |
62 const wchar_t ws4[] = L"\u1111\u2222\u3333\u4444"; | |
63 const wchar_t ws5[] = L"\u1111\u2222\u3333\u4444\u5555"; | |
64 const wchar_t ws6[] = L"\u1111\u2222\u3333\u4444\u5555\u6666"; | |
65 const wchar_t ws7[] = L"\u1111\u2222\u3333\u4444\u5555\u6666\u7777"; | |
66 const wchar_t ws8[] = | |
67 L"\u1111\u2222\u3333\u4444\u5555\u6666\u7777\u8888"; | |
68 const wchar_t ws9[] = | |
69 L"\u1111\u2222\u3333\u4444\u5555\u6666\u7777\u8888\u9999"; | |
70 extern const wchar_t wsx[]; | |
71 extern const wchar_t wsy[]; | |
72 | |
73 static const int imin = INT_MIN; | |
74 static const int imax = INT_MAX; | |
75 | |
76 /* Evaluate to an array of SIZE characters when non-negative, or to | |
77 a pointer to an unknown object otherwise. */ | |
78 #define buffer(size) \ | |
79 ((0 <= size) ? buffer + sizeof buffer - (size) : ptr) | |
80 | |
81 /* Helper to expand function to either __builtin_f or dummy_f to | |
82 make debugging GCC easy. */ | |
83 #define FUNC(f) \ | |
84 ((!LINE || LINE == __LINE__) ? __builtin_ ## f : dummy_ ## f) | |
85 | |
86 /* Macro to verify that calls to __builtin_sprintf (i.e., with no size | |
87 argument) issue diagnostics by correctly determining the size of | |
88 the destination buffer. */ | |
89 #define T(size, ...) \ | |
90 (FUNC (sprintf) (buffer (size), __VA_ARGS__), \ | |
91 sink (buffer, ptr)) | |
92 | |
93 /* Return a value in the range [MIN, MAX]. */ | |
94 #define IR(min, max) int_range (min, max) | |
95 | |
96 /* Return a string whose length is in the range [MIN, MAX] where | |
97 both MIN and MAX must be digits in the range [0, 9]. */ | |
98 #define SR(min, max) (int_value () < 0 ? s##min : s##max) | |
99 | |
100 /* Return a wide string whose length is in the range [MIN, MAX] where | |
101 both MIN and MAX must be digits in the range [0, 9]. */ | |
102 #define WR(min, max) (int_value () < 0 ? ws##min : ws##max) | |
103 | |
104 void test_narrow_string_with_precision (void) | |
105 { | |
106 T (-1, "%.*s", IR ( 0, 1), SR (0, 1)); | |
107 T (-1, "%.*s", IR ( 0, 1), SR (0, 2)); | |
108 T (-1, "%.*s", IR ( 0, 1), SR (0, 3)); | |
109 T (-1, "%.*s", IR ( 0, 1), SR (0, 4)); | |
110 T (-1, "%.*s", IR ( 0, 1), SR (0, 9)); | |
111 T (-1, "%.*s", IR ( 0, 2), SR (0, 9)); | |
112 T (-1, "%.*s", IR ( 0, 3), SR (0, 9)); | |
113 T (-1, "%.*s", IR ( 0, 4), SR (0, 9)); | |
114 T (-1, "%.*s", IR ( 0, 9), SR (0, 9)); | |
115 T (-1, "%.*s", IR ( 0, 99), SR (0, 9)); | |
116 T (-1, "%.*s", IR ( 0, 99), SR (0, x)); | |
117 T (-1, "%.*s", IR ( 0, 99), SR (1, x)); | |
118 T (-1, "%.*s", IR ( 0, 99), SR (x, 1)); | |
119 T (-1, "%.*s", IR ( 0, 99), SR (x, 9)); | |
120 | |
121 T (-1, "%.*s", IR (imax / 3, imax / 2), SR (x, y)); | |
122 | |
123 /* Non-constant zero length string. */ | |
124 T ( 0, "%.*s", IR (imin, -1), SR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
125 T ( 0, "%.*s", IR (imin, 0), SR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
126 T ( 0, "%.*s", IR (-1, 0), SR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
127 T ( 0, "%.*s", IR (-1, 1), SR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
128 T ( 0, "%.*s", IR (-1, 99), SR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
129 | |
130 /* String with length between 0 and 1 character. */ | |
131 T ( 0, "%.*s", IR (imin, -1), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
132 T ( 0, "%.*s", IR (imin, 0), SR (0, 1)); /* { dg-warning "writing a terminating nul" } */ | |
133 T ( 0, "%.*s", IR (-2, -1), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
134 T ( 0, "%.*s", IR (-2, 0), SR (0, 1)); /* { dg-warning "writing a terminating nul" } */ | |
135 T ( 0, "%.*s", IR ( 0, 1), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
136 T ( 0, "%.*s", IR ( 0, 2), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
137 T ( 0, "%.*s", IR ( 0, 99), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
138 T ( 0, "%.*s", IR ( 0, imax), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
139 T ( 0, "%.*s", IR ( 1, imax), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
140 T ( 0, "%.*s", IR ( 9, imax), SR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
141 | |
142 /* String with length between 2 and 3 characters. */ | |
143 T ( 0, "%.*s", IR (imin, -1), SR (2, 3)); /* { dg-warning "writing between 2 and 3 bytes" } */ | |
144 T ( 0, "%.*s", IR (imin, 0), SR (2, 3)); /* { dg-warning "writing a terminating nul" } */ | |
145 T ( 0, "%.*s", IR (-2, -1), SR (2, 3)); /* { dg-warning "writing between 2 and 3 bytes" } */ | |
146 T ( 0, "%.*s", IR (-2, 0), SR (2, 3)); /* { dg-warning "writing a terminating nul" } */ | |
147 T ( 0, "%.*s", IR (-2, 1), SR (2, 3)); /* { dg-warning "writing up to 1 byte" } */ | |
148 T ( 0, "%.*s", IR ( 0, 1), SR (2, 3)); /* { dg-warning "writing up to 1 byte" } */ | |
149 T ( 0, "%.*s", IR ( 0, 2), SR (2, 3)); /* { dg-warning "writing up to 2 bytes" } */ | |
150 T ( 0, "%.*s", IR ( 0, 99), SR (2, 3)); /* { dg-warning "writing up to 3 bytes" } */ | |
151 T ( 0, "%.*s", IR ( 0, imax), SR (2, 3)); /* { dg-warning "writing up to 3 bytes" } */ | |
152 T ( 0, "%.*s", IR ( 1, 99), SR (2, 3)); /* { dg-warning "writing between 1 and 3 bytes" } */ | |
153 T ( 0, "%.*s", IR ( 9, 99), SR (2, 3)); /* { dg-warning "writing between 2 and 3 bytes" } */ | |
154 | |
155 T ( 0, "%.*s", IR ( 0, 1), SR (0, 9)); /* { dg-warning "writing up to 1 byte" } */ | |
156 T ( 0, "%.*s", IR ( 0, 2), SR (0, 9)); /* { dg-warning "writing up to 2 bytes" } */ | |
157 T ( 0, "%.*s", IR ( 0, 9), SR (0, 9)); /* { dg-warning "writing up to 9 bytes" } */ | |
158 T ( 0, "%.*s", IR ( 0, 79), SR (0, 9)); /* { dg-warning "writing up to 9 bytes" } */ | |
159 T ( 0, "%.*s", IR ( 1, 2), SR (0, 9)); /* { dg-warning "writing up to 2 bytes" } */ | |
160 T ( 0, "%.*s", IR ( 2, 3), SR (0, 9)); /* { dg-warning "writing up to 3 bytes" } */ | |
161 T ( 0, "%.*s", IR ( 7, 13), SR (0, 9)); /* { dg-warning "writing up to 9 bytes" } */ | |
162 | |
163 /* String between N and unknown number of characters long. */ | |
164 T ( 0, "%.*s", IR (imin, -1), SR (0, x)); /* { dg-warning "writing a terminating nul" } */ | |
165 T ( 0, "%.*s", IR (imin, -1), SR (1, x)); /* { dg-warning "writing likely 1 or more bytes" } */ | |
166 T ( 1, "%.*s", IR (imin, -1), SR (1, x)); /* { dg-warning "may write a terminating nul" } */ | |
167 T ( 1, "%.*s", IR (imin, -1), SR (8, x)); /* { dg-warning "writing likely 8 or more bytes" } */ | |
168 T ( 1, "%.*s", IR (imin, -1), SR (x, 9)); /* { dg-warning "writing likely 9 or more bytes" } */ | |
169 | |
170 /* Unknown strings. */ | |
171 T ( 1, "%.*s", IR (imin, -1), SR (x, y)); | |
172 T ( 1, "%.*s", IR (imin, 0), SR (x, y)); | |
173 T ( 1, "%.*s", IR ( -99, 1), SR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
174 T ( 1, "%.*s", IR ( -2, 2), SR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
175 T ( 1, "%.*s", IR ( -1, 99), SR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
176 T ( 1, "%.*s", IR ( 0, 99), SR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
177 T ( 1, "%.*s", IR ( 1, 99), SR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
178 T ( 1, "%.*s", IR ( 9, 99), SR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
179 } | |
180 | |
181 void test_narrow_string_with_width_and_precision (void) | |
182 { | |
183 T (-1, "%*.*s", IR ( 0, 1), IR ( 0, 1), SR (0, 1)); | |
184 T (-1, "%*.*s", IR ( 0, 1), IR ( 0, 1), SR (0, 2)); | |
185 T (-1, "%*.*s", IR ( 0, 1), IR ( 0, 1), SR (0, 3)); | |
186 T (-1, "%*.*s", IR ( 0, 1), IR ( 0, 1), SR (0, 4)); | |
187 T (-1, "%*.*s", IR ( 0, 1), IR ( 0, 1), SR (0, 9)); | |
188 T (-1, "%*.*s", IR ( 0, 2), IR ( 0, 2), SR (0, 9)); | |
189 T (-1, "%*.*s", IR ( 0, 3), IR ( 0, 3), SR (0, 9)); | |
190 T (-1, "%*.*s", IR ( 0, 4), IR ( 0, 4), SR (0, 9)); | |
191 T (-1, "%*.*s", IR ( 0, 9), IR ( 0, 9), SR (0, 9)); | |
192 T (-1, "%*.*s", IR ( 0, 99), IR ( 0, 99), SR (0, 9)); | |
193 T (-1, "%*.*s", IR ( 0, 99), IR ( 0, 99), SR (0, x)); | |
194 T (-1, "%*.*s", IR ( 0, 99), IR ( 0, 99), SR (1, x)); | |
195 T (-1, "%*.*s", IR ( 0, 99), IR ( 0, 99), SR (x, 1)); | |
196 T (-1, "%*.*s", IR ( 0, 99), IR ( 0, 99), SR (x, 9)); | |
197 T (-1, "%*.*s", IR (12, 34), IR (45, 67), SR (x, 9)); | |
198 T (-1, "%*.*s", IR (12, 34), IR (45, 67), SR (x, y)); | |
199 | |
200 T (-1, "%*.*s", IR (imax / 5, imax / 4), IR (imax / 3, imax / 2), SR (x, y)); | |
201 | |
202 T (-1, "%*.*s %*.*s", | |
203 IR (imax / 9, imax / 8), IR (imax / 7, imax / 6), SR (x, y), | |
204 IR (imax / 5, imax / 4), IR (imax / 3, imax / 2), SR (x, y)); | |
205 | |
206 /* The two directives below combined convert to [INT_MAX, INT_MAX + 1]. | |
207 Since the lower end of the range doesn't exceed INT_MAX no warning | |
208 is expected. */ | |
209 T (-1, "%*.*s%*.*s", | |
210 IR (imax - 5, imax - 3), IR (1, 2), SR (x, y), | |
211 IR ( 5, 6), IR (3, 4), SR (x, y)); | |
212 | |
213 /* The three directives below (the two %s plus the space in between) | |
214 combined convert to [INT_MAX + 1, INT_MAX + 2]. Since the lower | |
215 end of the range exceeds INT_MAX a warning is expected. */ | |
216 T (-1, "%*.*s %*.*s", /* { dg-warning "INT_MAX" } */ | |
217 IR (imax - 5, imax - 3), IR (1, 2), SR (x, y), | |
218 IR ( 5, 6), IR (3, 4), SR (x, y)); | |
219 | |
220 /* Non-constant zero length string. */ | |
221 T ( 0, "%*.*s", IR ( 0, 1), IR (imin, -1), SR (0, 0)); /* { dg-warning "writing up to 1 byte" } */ | |
222 T ( 0, "%*.*s", IR ( 0, 2), IR (imin, -1), SR (0, 0)); /* { dg-warning "writing up to 2 bytes" } */ | |
223 T ( 0, "%*.*s", IR ( 0, 3), IR (imin, -1), SR (0, 0)); /* { dg-warning "writing up to 3 bytes" } */ | |
224 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 1), SR (0, 0)); /* { dg-warning "writing up to 3 bytes" } */ | |
225 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 1), SR (0, 1)); /* { dg-warning "writing up to 3 bytes" } */ | |
226 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 2), SR (0, 1)); /* { dg-warning "writing up to 3 bytes" } */ | |
227 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 3), SR (0, 1)); /* { dg-warning "writing up to 3 bytes" } */ | |
228 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 1), SR (3, 5)); /* { dg-warning "writing up to 3 bytes" } */ | |
229 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 2), SR (3, 5)); /* { dg-warning "writing up to 3 bytes" } */ | |
230 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 3), SR (3, 5)); /* { dg-warning "writing up to 3 bytes" } */ | |
231 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 4), SR (3, 5)); /* { dg-warning "writing up to 4 bytes" } */ | |
232 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 5), SR (3, 5)); /* { dg-warning "writing up to 5 bytes" } */ | |
233 T ( 0, "%*.*s", IR ( 0, 3), IR ( 0, 6), SR (3, 5)); /* { dg-warning "writing up to 5 bytes" } */ | |
234 | |
235 T ( 0, "%*.*s", IR ( 1, 2), IR ( 0, 1), SR (3, 5)); /* { dg-warning "writing between 1 and 2 bytes" } */ | |
236 T ( 0, "%*.*s", IR ( 1, 2), IR ( 0, 2), SR (3, 5)); /* { dg-warning "writing between 1 and 2 bytes" } */ | |
237 T ( 0, "%*.*s", IR ( 1, 2), IR ( 0, 3), SR (3, 5)); /* { dg-warning "writing between 1 and 3 bytes" } */ | |
238 T ( 0, "%*.*s", IR ( 1, 2), IR ( 0, 4), SR (3, 5)); /* { dg-warning "writing between 1 and 4 bytes" } */ | |
239 T ( 0, "%*.*s", IR ( 1, 2), IR ( 0, 5), SR (3, 5)); /* { dg-warning "writing between 1 and 5 bytes" } */ | |
240 T ( 0, "%*.*s", IR ( 1, 2), IR ( 0, 6), SR (3, 5)); /* { dg-warning "writing between 1 and 5 bytes" } */ | |
241 T ( 0, "%*.*s", IR ( 2, 3), IR ( 0, 6), SR (3, 5)); /* { dg-warning "writing between 2 and 5 bytes" } */ | |
242 T ( 0, "%*.*s", IR ( 2, 3), IR ( 1, 6), SR (3, 5)); /* { dg-warning "writing between 2 and 5 bytes" } */ | |
243 T ( 0, "%*.*s", IR ( 2, 3), IR ( 2, 6), SR (3, 5)); /* { dg-warning "writing between 2 and 5 bytes" } */ | |
244 T ( 0, "%*.*s", IR ( 2, 3), IR ( 3, 6), SR (3, 5)); /* { dg-warning "writing between 3 and 5 bytes" } */ | |
245 T ( 0, "%*.*s", IR ( 2, 3), IR ( 4, 6), SR (3, 5)); /* { dg-warning "writing between 3 and 5 bytes" } */ | |
246 T ( 0, "%*.*s", IR ( 2, 3), IR ( 5, 6), SR (3, 5)); /* { dg-warning "writing between 3 and 5 bytes" } */ | |
247 } | |
248 | |
249 void test_wide_string (void) | |
250 { | |
251 T (-1, "%.*ls", IR ( 0, 1), WR (0, 1)); | |
252 T (-1, "%.*ls", IR ( 0, 1), WR (0, 2)); | |
253 T (-1, "%.*ls", IR ( 0, 1), WR (0, 3)); | |
254 T (-1, "%.*ls", IR ( 0, 1), WR (0, 4)); | |
255 T (-1, "%.*ls", IR ( 0, 1), WR (0, 9)); | |
256 T (-1, "%.*ls", IR ( 0, 2), WR (0, 9)); | |
257 T (-1, "%.*ls", IR ( 0, 3), WR (0, 9)); | |
258 T (-1, "%.*ls", IR ( 0, 4), WR (0, 9)); | |
259 T (-1, "%.*ls", IR ( 0, 9), WR (0, 9)); | |
260 T (-1, "%.*ls", IR ( 0, 99), WR (0, 9)); | |
261 T (-1, "%.*ls", IR ( 0, 99), WR (0, x)); | |
262 T (-1, "%.*ls", IR ( 0, 99), WR (1, x)); | |
263 T (-1, "%.*ls", IR ( 0, 99), WR (x, 1)); | |
264 T (-1, "%.*ls", IR ( 0, 99), WR (x, 9)); | |
265 | |
266 /* Non-constant zero length string. */ | |
267 T ( 0, "%.*ls", IR (imin, -1), WR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
268 T ( 0, "%.*ls", IR (imin, 0), WR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
269 T ( 0, "%.*ls", IR (-1, 0), WR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
270 T ( 0, "%.*ls", IR (-1, 1), WR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
271 T ( 0, "%.*ls", IR (-1, 99), WR (0, 0)); /* { dg-warning "writing a terminating nul" } */ | |
272 | |
273 /* String with length between 0 and 1 character. */ | |
274 T ( 0, "%.*ls", IR (imin, -1), WR (0, 1)); /* { dg-warning "writing up to 6 bytes" } */ | |
275 T ( 0, "%.*ls", IR (imin, 0), WR (0, 1)); /* { dg-warning "writing a terminating nul" } */ | |
276 T ( 0, "%.*ls", IR (-2, -1), WR (0, 1)); /* { dg-warning "writing up to 6 bytes" } */ | |
277 T ( 0, "%.*ls", IR (-2, 0), WR (0, 1)); /* { dg-warning "writing a terminating nul" } */ | |
278 T ( 0, "%.*ls", IR ( 0, 1), WR (0, 1)); /* { dg-warning "writing up to 1 byte" } */ | |
279 T ( 0, "%.*ls", IR ( 0, 2), WR (0, 1)); /* { dg-warning "writing up to 2 bytes" } */ | |
280 T ( 0, "%.*ls", IR ( 0, 99), WR (0, 1)); /* { dg-warning "writing up to 6 bytes" } */ | |
281 T ( 0, "%.*ls", IR ( 0, imax), WR (0, 1)); /* { dg-warning "writing up to 6 bytes" } */ | |
282 T ( 0, "%.*ls", IR ( 1, imax), WR (0, 1)); /* { dg-warning "writing up to 6 bytes" } */ | |
283 T ( 0, "%.*ls", IR ( 9, imax), WR (0, 1)); /* { dg-warning "writing up to 6 bytes" } */ | |
284 | |
285 /* String with length between 2 and 3 characters. */ | |
286 T ( 0, "%.*ls", IR (imin, -1), WR (2, 3)); /* { dg-warning "writing up to 18 bytes" } */ | |
287 T ( 0, "%.*ls", IR (imin, 0), WR (2, 3)); /* { dg-warning "writing a terminating nul" } */ | |
288 T ( 0, "%.*ls", IR (-2, -1), WR (2, 3)); /* { dg-warning "writing up to 18 bytes" } */ | |
289 T ( 0, "%.*ls", IR (-2, 0), WR (2, 3)); /* { dg-warning "writing a terminating nul" } */ | |
290 T ( 0, "%.*ls", IR (-2, 1), WR (2, 3)); /* { dg-warning "writing up to 1 byte" } */ | |
291 T ( 0, "%.*ls", IR ( 0, 1), WR (2, 3)); /* { dg-warning "writing up to 1 byte" } */ | |
292 T ( 0, "%.*ls", IR ( 0, 2), WR (2, 3)); /* { dg-warning "writing up to 2 bytes" } */ | |
293 T ( 0, "%.*ls", IR ( 0, 99), WR (2, 3)); /* { dg-warning "writing up to 18 bytes" } */ | |
294 T ( 0, "%.*ls", IR ( 0, imax), WR (2, 3)); /* { dg-warning "writing up to 18 bytes" } */ | |
295 T ( 0, "%.*ls", IR ( 1, 99), WR (2, 3)); /* { dg-warning "writing up to 18 bytes" } */ | |
296 T ( 0, "%.*ls", IR ( 9, 99), WR (2, 3)); /* { dg-warning "writing up to 18 bytes" } */ | |
297 | |
298 T ( 0, "%.*ls", IR ( 0, 1), WR (0, 9)); /* { dg-warning "writing up to 1 byte" } */ | |
299 T ( 0, "%.*ls", IR ( 0, 2), WR (0, 9)); /* { dg-warning "writing up to 2 bytes" } */ | |
300 T ( 0, "%.*ls", IR ( 0, 9), WR (0, 9)); /* { dg-warning "writing up to 9 bytes" } */ | |
301 T ( 0, "%.*ls", IR ( 0, 53), WR (0, 9)); /* { dg-warning "writing up to 53 bytes" } */ | |
302 T ( 0, "%.*ls", IR ( 0, 55), WR (0, 9)); /* { dg-warning "writing up to 54 bytes" } */ | |
303 T ( 0, "%.*ls", IR ( 1, 2), WR (0, 9)); /* { dg-warning "writing up to 2 bytes" } */ | |
304 T ( 0, "%.*ls", IR ( 2, 3), WR (0, 9)); /* { dg-warning "writing up to 3 bytes" } */ | |
305 T ( 0, "%.*ls", IR ( 7, 13), WR (0, 9)); /* { dg-warning "writing up to 13 bytes" } */ | |
306 | |
307 /* String between N and unknown number of characters long. */ | |
308 T ( 0, "%.*ls", IR (imin, -1), WR (0, x)); /* { dg-warning "writing a terminating nul" } */ | |
309 T ( 0, "%.*ls", IR (imin, -1), WR (1, x)); /* { dg-warning "writing likely 2 or more bytes" } */ | |
310 T ( 1, "%.*ls", IR (imin, -1), WR (1, x)); /* { dg-warning "writing likely 2 or more bytes" } */ | |
311 T ( 1, "%.*ls", IR (imin, -1), WR (8, x)); /* { dg-warning "writing likely 16 or more bytes" } */ | |
312 T ( 1, "%.*ls", IR (imin, -1), WR (x, 9)); /* { dg-warning "writing likely 18 or more bytes" } */ | |
313 | |
314 /* Unknown strings. */ | |
315 T ( 1, "%.*ls", IR (imin, -1), WR (x, y)); | |
316 T ( 1, "%.*ls", IR (imin, 0), WR (x, y)); | |
317 T ( 1, "%.*ls", IR ( -99, 1), WR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
318 T ( 1, "%.*ls", IR ( -2, 2), WR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
319 T ( 1, "%.*ls", IR ( -1, 99), WR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
320 T ( 1, "%.*ls", IR ( 0, 99), WR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
321 T ( 1, "%.*ls", IR ( 1, 99), WR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
322 T ( 1, "%.*ls", IR ( 9, 99), WR (x, y)); /* { dg-warning "may write a terminating nul" } */ | |
323 } |