annotate gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-9.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 /* { dg-do compile } */
kono
parents:
diff changeset
2 /* { dg-options "-O2 -Wformat -Wformat-overflow=2 -ftrack-macro-expansion=0" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 typedef __SIZE_TYPE__ size_t;
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 #define INT_MAX __INT_MAX__
kono
parents:
diff changeset
7 #define INT_MIN (-INT_MAX - 1)
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 #ifndef LINE
kono
parents:
diff changeset
10 # define LINE 0
kono
parents:
diff changeset
11 #endif
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 int dummy_sprintf (char*, const char*, ...);
kono
parents:
diff changeset
14 void sink (void*);
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 char buffer[4096];
kono
parents:
diff changeset
17 char *ptr;
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 /* Helper to expand function to either __builtin_f or dummy_f to
kono
parents:
diff changeset
20 make debugging GCC easy. */
kono
parents:
diff changeset
21 #define FUNC(f) \
kono
parents:
diff changeset
22 ((!LINE || LINE == __LINE__) ? __builtin_ ## f : dummy_ ## f)
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 /* Evaluate to an array of SIZE characters when non-negative, or to
kono
parents:
diff changeset
25 a pointer to an unknown object otherwise. */
kono
parents:
diff changeset
26 #define buffer(size) \
kono
parents:
diff changeset
27 ((0 <= size) ? buffer + sizeof buffer - (size) : ptr)
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 #define T(bufsize, fmt, ...) \
kono
parents:
diff changeset
30 do { \
kono
parents:
diff changeset
31 char *buf = buffer (bufsize); \
kono
parents:
diff changeset
32 FUNC (sprintf)(buf, fmt, __VA_ARGS__); \
kono
parents:
diff changeset
33 sink (buf); \
kono
parents:
diff changeset
34 } while (0)
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /* Identity function to verify that the checker figures out the value
kono
parents:
diff changeset
38 of the operand even when it's not constant (i.e., makes use of
kono
parents:
diff changeset
39 inlining and constant propagation information). */
kono
parents:
diff changeset
40
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
41 static int i (int x) { return x; }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
42 static const char* s (const char *str) { return str; }
111
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 /* Function to "generate" a unique unknown number (as far as GCC can
kono
parents:
diff changeset
45 tell) each time it's called. It prevents the optimizer from being
kono
parents:
diff changeset
46 able to narrow down the ranges of possible values in test functions
kono
parents:
diff changeset
47 with repeated references to the same variable. */
kono
parents:
diff changeset
48 extern int value (void);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 /* Return a value in the range [MIN, MAX]. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
51 static int range (int min, int max)
111
kono
parents:
diff changeset
52 {
kono
parents:
diff changeset
53 int val = value ();
kono
parents:
diff changeset
54 return val < min || max < val ? min : val;
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 #define R(min, max) range (min, max)
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 /* Verify that the checker can detect buffer overflow when the "%s"
kono
parents:
diff changeset
60 argument is in a known range of lengths and one or both of which
kono
parents:
diff changeset
61 exceed the size of the destination. */
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 void test_sprintf_chk_string (const char *s)
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 T (1, "%*s", R (0, 1), ""); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
66 T (1, "%*s", R (-2, -1), ""); /* { dg-warning "writing up to 2 bytes" } */
kono
parents:
diff changeset
67 T (1, "%*s", R (-3, 2), ""); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
68 T (1, "%*s", R (-4, 5), ""); /* { dg-warning "writing up to 5 bytes" } */
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 T (1, "%*s", R ( -5, 6), "1"); /* { dg-warning "writing between 1 and 6 bytes" } */
kono
parents:
diff changeset
71 T (1, "%*s", R ( -6, 7), "12"); /* { dg-warning "writing between 2 and 7 bytes" } */
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 T (1, "%.*s", R (0, 1), "");
kono
parents:
diff changeset
74 T (1, "%.*s", R (0, 1), s); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
75 T (1, "%.*s", R (-2, -1), "");
kono
parents:
diff changeset
76 T (1, "%.*s", R (-2, -1), s); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
77 T (1, "%.*s", R (-3, 2), "");
kono
parents:
diff changeset
78 T (1, "%.*s", R (-4, 5), "");
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 T (1, "%.*s", R ( -5, 6), "1"); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
81 T (1, "%.*s", R ( -6, 7), "12"); /* { dg-warning "writing up to 2 bytes " } */
kono
parents:
diff changeset
82 T (1, "%.*s", R ( 1, 7), "12"); /* { dg-warning "writing between 1 and 2 bytes " } */
kono
parents:
diff changeset
83 T (1, "%.*s", R ( 2, 7), "12"); /* { dg-warning "writing 2 bytes " } */
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 T (1, "%*.*s", R (0, 1), R (0, 1), ""); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
86 T (1, "%*.*s", R (0, 2), R (0, 1), ""); /* { dg-warning "directive writing up to 2 bytes into a region of size 1" } */
kono
parents:
diff changeset
87 T (1, "%*.*s", R (0, 3), R (0, 1), ""); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 T (1, "%*.*s", R (0, 1), R (0, 1), "1"); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
90 T (1, "%*.*s", R (0, 2), R (0, 1), "1"); /* { dg-warning "writing up to 2 bytes" } */
kono
parents:
diff changeset
91 T (1, "%*.*s", R (0, 3), R (0, 1), "1"); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 T (1, "%*.*s", R (0, 1), R (0, 1), "12"); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
94 T (1, "%*.*s", R (0, 2), R (0, 1), "12"); /* { dg-warning "writing up to 2 bytes" } */
kono
parents:
diff changeset
95 T (1, "%*.*s", R (0, 3), R (0, 1), "12"); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 T (1, "%*.*s", R (0, 1), R (0, 1), "123"); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
98 T (1, "%*.*s", R (0, 2), R (0, 1), "123"); /* { dg-warning "writing up to 2 bytes" } */
kono
parents:
diff changeset
99 T (1, "%*.*s", R (0, 3), R (0, 1), "123"); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
100 T (1, "%*.*s", R (0, 3), R (0, 1), s); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 T (1, "%*.*s", R (0, 1), R (0, 2), "123"); /* { dg-warning "writing up to 2 bytes" } */
kono
parents:
diff changeset
103 T (1, "%*.*s", R (0, 2), R (0, 2), "123"); /* { dg-warning "writing up to 2 bytes" } */
kono
parents:
diff changeset
104 T (1, "%*.*s", R (0, 3), R (0, 2), "123"); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
105 T (1, "%*.*s", R (0, 3), R (0, 2), s); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 T (1, "%*.*s", R (0, 1), R (0, 3), "123"); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
108 T (1, "%*.*s", R (0, 2), R (0, 3), "123"); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
109 T (1, "%*.*s", R (0, 3), R (0, 3), "123"); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
110 T (1, "%*.*s", R (0, 3), R (0, 3), s); /* { dg-warning "writing up to 3 bytes" } */
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 T (1, "%*.*s", R (1, 1), R (0, 3), "123"); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
113 T (1, "%*.*s", R (1, 2), R (0, 3), "123"); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
114 T (1, "%*.*s", R (1, 3), R (0, 3), "123"); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
115 T (1, "%*.*s", R (1, 3), R (0, 3), s); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 T (1, "%*.*s", R (1, 1), R (1, 3), "123"); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
118 T (1, "%*.*s", R (1, 2), R (1, 3), "123"); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
119 T (1, "%*.*s", R (1, 3), R (1, 3), "123"); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
120 T (1, "%*.*s", R (1, 3), R (1, 3), s); /* { dg-warning "writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 T (1, "%*.*s", R (2, 3), R (1, 3), "123"); /* { dg-warning "writing between 2 and 3 bytes" } */
kono
parents:
diff changeset
123 T (1, "%*.*s", R (3, 4), R (1, 3), "123"); /* { dg-warning "writing between 3 and 4 bytes" } */
kono
parents:
diff changeset
124 T (1, "%*.*s", R (4, 5), R (1, 3), "123"); /* { dg-warning "writing between 4 and 5 bytes" } */
kono
parents:
diff changeset
125 T (1, "%*.*s", R (2, 3), R (1, 3), s); /* { dg-warning "writing between 2 and 3 bytes" } */
kono
parents:
diff changeset
126 }
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 void test_sprintf_chk_int (int w, int p, int i)
kono
parents:
diff changeset
129 {
kono
parents:
diff changeset
130 T (1, "%*d", w, 0); /* { dg-warning "may write a terminating nul|directive writing between 1 and \[0-9\]+ bytes" } */
kono
parents:
diff changeset
131 T (1, "%*d", w, i); /* { dg-warning "may write a terminating nul|directive writing between 1 and \[0-9\]+ bytes" } */
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 T (1, "%*d", R (-1, 1), 0); /* { dg-warning "writing a terminating nul" } */
kono
parents:
diff changeset
134 T (1, "%*d", R ( 0, 1), 0); /* { dg-warning "writing a terminating nul" } */
kono
parents:
diff changeset
135 T (1, "%+*d", R ( 0, 1), 0); /* { dg-warning "directive writing 2 bytes" } */
kono
parents:
diff changeset
136 T (1, "%+*u", R ( 0, 1), 0); /* { dg-warning "writing a terminating nul" } */
kono
parents:
diff changeset
137 T (2, "%*d", R (-3, -2), 0); /* { dg-warning "directive writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
138 T (2, "%*d", R (-3, -1), 0); /* { dg-warning "directive writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
139 T (2, "%*d", R (-3, 0), 0); /* { dg-warning "directive writing between 1 and 3 bytes" } */
kono
parents:
diff changeset
140 T (2, "%*d", R (-2, -1), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
141 T (2, "%*d", R (-2, 2), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
142 T (2, "%*d", R (-1, 2), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
143 T (2, "%*d", R ( 0, 2), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
144 T (2, "%*d", R ( 1, 2), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 T (1, "%.*d", p, 0); /* { dg-warning "may write a terminating nul|directive writing up to \[0-9\]+ bytes" } */
kono
parents:
diff changeset
147 T (1, "%.*d", p, i); /* { dg-warning "may write a terminating nul||directive writing up to \[0-9\]+ bytes" } */
kono
parents:
diff changeset
148 T (1, "%.*d", R (INT_MIN, -1), 0); /* { dg-warning "writing a terminating nul" } */
kono
parents:
diff changeset
149 T (1, "%.*d", R (INT_MIN, 0), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
150 T (1, "%.*d", R (-2, -1), 0); /* { dg-warning "writing a terminating nul" } */
kono
parents:
diff changeset
151 T (1, "%.*d", R (-1, 1), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
152 T (1, "%.*d", R ( 0, 1), 0); /* { dg-warning "may write a terminating nul" } */
kono
parents:
diff changeset
153 T (1, "%.*d", R ( 0, 2), 0); /* { dg-warning "directive writing up to 2 bytes" } */
kono
parents:
diff changeset
154 T (1, "%.*d", R ( 0, INT_MAX - 1), 0); /* { dg-warning "directive writing up to \[0-9\]+ bytes" } */
kono
parents:
diff changeset
155 T (1, "%.*d", R ( 1, INT_MAX - 1), 0); /* { dg-warning "directive writing between 1 and \[0-9\]+ bytes" } */
kono
parents:
diff changeset
156 }
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 /* { dg-prune-output "flag used with .%.. gnu_printf format" } */