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

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR tree-optimization/80523 - -Wformat-overflow doesn't consider
kono
parents:
diff changeset
2 -fexec-charset
kono
parents:
diff changeset
3 { dg-do compile }
kono
parents:
diff changeset
4 { dg-require-iconv "IBM1047" }
kono
parents:
diff changeset
5 { dg-options "-O2 -Wall -Wno-format -Wformat-overflow -fexec-charset=IBM1047 -ftrack-macro-expansion=0" } */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 char buf[1];
kono
parents:
diff changeset
8 void sink (void*);
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 #define T(...) (__builtin_sprintf (buf + 1, __VA_ARGS__), sink (buf))
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 /* Exercise all special C and POSIX characters. */
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 void test_characters ()
kono
parents:
diff changeset
15 {
kono
parents:
diff changeset
16 T ("%%"); /* { dg-warning ".%%. directive writing 1 byte" } */
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 T ("%A", 0.0); /* { dg-warning ".%A. directive writing between 6 and 20 " } */
kono
parents:
diff changeset
19 T ("%a", 0.0); /* { dg-warning ".%a. directive writing between 6 and 20 " } */
kono
parents:
diff changeset
20
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
21 T ("%C", L'a'); /* { dg-warning ".%C. directive writing up to 6 bytes" } */
111
kono
parents:
diff changeset
22 T ("%c", 'a'); /* { dg-warning ".%c. directive writing 1 byte" } */
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 T ("%d", 12); /* { dg-warning ".%d. directive writing 2 bytes" } */
kono
parents:
diff changeset
25 T ("% d", 12); /* { dg-warning ".% d. directive writing 3 bytes" } */
kono
parents:
diff changeset
26 T ("%-d", 123); /* { dg-warning ".%-d. directive writing 3 bytes" } */
kono
parents:
diff changeset
27 T ("%+d", 1234); /* { dg-warning ".%\\+d. directive writing 5 bytes" } */
kono
parents:
diff changeset
28 T ("%'d", 1234); /* { dg-warning ".%'d. directive writing 5 bytes" "bug 80535" { xfail *-*-* } } */
kono
parents:
diff changeset
29 T ("%1$d", 2345); /* { dg-warning ".%1\\\$d. directive writing 4 bytes" } */
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 /* Verify that digits are correctly interpreted as width and precision. */
kono
parents:
diff changeset
32 T ("%0d", 12345); /* { dg-warning ".%0d. directive writing 5 bytes" } */
kono
parents:
diff changeset
33 T ("%1d", 12345); /* { dg-warning ".%1d. directive writing 5 bytes" } */
kono
parents:
diff changeset
34 T ("%2d", 12345); /* { dg-warning ".%2d. directive writing 5 bytes" } */
kono
parents:
diff changeset
35 T ("%3d", 12345); /* { dg-warning ".%3d. directive writing 5 bytes" } */
kono
parents:
diff changeset
36 T ("%4d", 12345); /* { dg-warning ".%4d. directive writing 5 bytes" } */
kono
parents:
diff changeset
37 T ("%5d", 12345); /* { dg-warning ".%5d. directive writing 5 bytes" } */
kono
parents:
diff changeset
38 T ("%6d", 12345); /* { dg-warning ".%6d. directive writing 6 bytes" } */
kono
parents:
diff changeset
39 T ("%7d", 12345); /* { dg-warning ".%7d. directive writing 7 bytes" } */
kono
parents:
diff changeset
40 T ("%8d", 12345); /* { dg-warning ".%8d. directive writing 8 bytes" } */
kono
parents:
diff changeset
41 T ("%9d", 12345); /* { dg-warning ".%9d. directive writing 9 bytes" } */
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 T ("%.0d", 12345); /* { dg-warning ".%.0d. directive writing 5 bytes" } */
kono
parents:
diff changeset
44 T ("%.1d", 12345); /* { dg-warning ".%.1d. directive writing 5 bytes" } */
kono
parents:
diff changeset
45 T ("%.2d", 12345); /* { dg-warning ".%.2d. directive writing 5 bytes" } */
kono
parents:
diff changeset
46 T ("%.3d", 12345); /* { dg-warning ".%.3d. directive writing 5 bytes" } */
kono
parents:
diff changeset
47 T ("%.4d", 12345); /* { dg-warning ".%.4d. directive writing 5 bytes" } */
kono
parents:
diff changeset
48 T ("%.5d", 12345); /* { dg-warning ".%.5d. directive writing 5 bytes" } */
kono
parents:
diff changeset
49 T ("%.6d", 12345); /* { dg-warning ".%.6d. directive writing 6 bytes" } */
kono
parents:
diff changeset
50 T ("%.7d", 12345); /* { dg-warning ".%.7d. directive writing 7 bytes" } */
kono
parents:
diff changeset
51 T ("%.8d", 12345); /* { dg-warning ".%.8d. directive writing 8 bytes" } */
kono
parents:
diff changeset
52 T ("%.9d", 12345); /* { dg-warning ".%.9d. directive writing 9 bytes" } */
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 T ("%hhd", 12); /* { dg-warning ".%hhd. directive writing 2 bytes" } */
kono
parents:
diff changeset
55 T ("%hd", 234); /* { dg-warning ".%hd. directive writing 3 bytes" } */
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 {
kono
parents:
diff changeset
58 const __PTRDIFF_TYPE__ i = 3456;
kono
parents:
diff changeset
59 T ("%jd", i); /* { dg-warning ".%jd. directive writing 4 bytes" } */
kono
parents:
diff changeset
60 }
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 T ("%ld", 45678L); /* { dg-warning ".%ld. directive writing 5 bytes" } */
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 const __PTRDIFF_TYPE__ i = 56789;
kono
parents:
diff changeset
66 T ("%td", i); /* { dg-warning ".%td. directive writing 5 bytes" } */
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 {
kono
parents:
diff changeset
70 const __SIZE_TYPE__ i = 67890;
kono
parents:
diff changeset
71 T ("%zd", i); /* { dg-warning ".%zd. directive writing 5 bytes" } */
kono
parents:
diff changeset
72 }
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 T ("%E", 0.0); /* { dg-warning ".%E. directive writing 12 bytes" } */
kono
parents:
diff changeset
75 T ("%e", 0.0); /* { dg-warning ".%e. directive writing 12 bytes" } */
kono
parents:
diff changeset
76 T ("%F", 0.0); /* { dg-warning ".%F. directive writing 8 bytes" } */
kono
parents:
diff changeset
77 T ("%f", 0.0); /* { dg-warning ".%f. directive writing 8 bytes" } */
kono
parents:
diff changeset
78 T ("%G", 0.0); /* { dg-warning ".%G. directive writing 1 byte" } */
kono
parents:
diff changeset
79 T ("%g", 0.0); /* { dg-warning ".%g. directive writing 1 byte" } */
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 T ("%i", 123); /* { dg-warning ".%i. directive writing 3 bytes" } */
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 int n;
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 T ("%n", &n); /* { dg-warning "writing a terminating nul" } */
kono
parents:
diff changeset
87 T ("%nH", &n); /* { dg-warning ".H. directive writing 1 byte" } */
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 T ("%o", 999); /* { dg-warning ".%o. directive writing 4 bytes" } */
kono
parents:
diff changeset
91 T ("%#o", 999); /* { dg-warning ".%#o. directive writing 5 bytes" } */
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 T ("%x", 1234); /* { dg-warning ".%x. directive writing 3 bytes" } */
kono
parents:
diff changeset
94 T ("%#X", 1235); /* { dg-warning ".%#X. directive writing 5 bytes" } */
kono
parents:
diff changeset
95
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
96 T ("%S", L"1"); /* { dg-warning ".%S. directive writing up to 6 bytes" } */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
97 T ("%ls", L"12"); /* { dg-warning ".%ls. directive writing up to 12 bytes" } */
111
kono
parents:
diff changeset
98 T ("%-s", "1"); /* { dg-warning ".%-s. directive writing 1 byte" } */
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 /* Verify that characters in the source character set appear in
kono
parents:
diff changeset
101 the text of the warning unchanged (i.e., not as their equivalents
kono
parents:
diff changeset
102 in the execution character set on the target). The trailing %%
kono
parents:
diff changeset
103 disables sprintf->strcpy optimization. */
kono
parents:
diff changeset
104 T ("ABCDEFGHIJ%%"); /* { dg-warning ".ABCDEFGHIJ. directive writing 10 bytes" } */
kono
parents:
diff changeset
105 T ("KLMNOPQRST%%"); /* { dg-warning ".KLMNOPQRST. directive writing 10 bytes" } */
kono
parents:
diff changeset
106 T ("UVWXYZ%%"); /* { dg-warning ".UVWXYZ. directive writing 6 bytes" } */
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 T ("abcdefghij%%"); /* { dg-warning ".abcdefghij. directive writing 10 bytes" } */
kono
parents:
diff changeset
109 T ("klmnopqrst%%"); /* { dg-warning ".klmnopqrst. directive writing 10 bytes" } */
kono
parents:
diff changeset
110 T ("uvwxyz%%"); /* { dg-warning ".uvwxyz. directive writing 6 bytes" } */
kono
parents:
diff changeset
111 }
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 #undef T
kono
parents:
diff changeset
114 #define T(...) (__builtin_sprintf (d, __VA_ARGS__), sink (d))
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 void test_width_and_precision_out_of_range (char *d)
kono
parents:
diff changeset
117 {
kono
parents:
diff changeset
118 /* The range here happens to be a property of the compiler, not
kono
parents:
diff changeset
119 one of the target. */
kono
parents:
diff changeset
120 T ("%9223372036854775808i", 0); /* { dg-warning "width out of range" } */
kono
parents:
diff changeset
121 /* { dg-warning "result to exceed .INT_MAX." "" { target *-*-* } .-1 } */
kono
parents:
diff changeset
122 T ("%.9223372036854775808i", 0); /* { dg-warning "precision out of range" } */
kono
parents:
diff changeset
123 /* { dg-warning "causes result to exceed .INT_MAX." "" { target *-*-* } .-1 } */
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 /* The following is diagnosed by -Wformat (disabled here). */
kono
parents:
diff changeset
126 /* T ("%9223372036854775808$i", 0); */
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 /* Verify that an excessively long directive is truncated and the truncation
kono
parents:
diff changeset
130 is indicated by three trailing dots in the text of the warning. */
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 void test_overlong_plain_string ()
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 static const char longfmtstr[] =
kono
parents:
diff changeset
135 "0123456789012345678901234567890123456789012345678901234567890123456789%%";
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 char d[1];
kono
parents:
diff changeset
138 T (longfmtstr); /* { dg-warning ".0123\[0-9\]\*\.\.\.. directive writing 70 bytes" } */
kono
parents:
diff changeset
139 }