annotate gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-11.c @ 131:84e7813d76e9

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