2 #include "analyzer-decls.h"
4 /* Zero-fill of uninitialized buffer. */
9 void *p
= memset (buf
, 0, 256);
10 __analyzer_eval (buf
[42] == 0); /* { dg-warning "TRUE" } */
11 __analyzer_eval (p
== buf
); /* { dg-warning "TRUE" } */
14 /* As above, but with __builtin_memset. */
19 __builtin_memset (buf
, 0, 256);
20 __analyzer_eval (buf
[42] == 0); /* { dg-warning "TRUE" } */
23 /* Zero-fill of partially initialized buffer. */
29 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "TRUE" } */
31 __analyzer_eval (buf
[42] == '\0'); /* { dg-warning "TRUE" } */
34 /* A "memset" with known non-zero value. */
39 memset (buf
, 'A', 256);
40 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "TRUE" } */
43 /* A "memset" with unknown value. */
45 void test_4 (char val
)
48 memset (buf
, val
, 256);
49 __analyzer_eval (buf
[42] == (char)val
); /* { dg-warning "TRUE" } */
52 /* A "memset" with unknown num bytes. */
58 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "TRUE" } */
61 /* We can't know if buf[42] was overwritten by the memset or not. */
62 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "UNKNOWN" } */
63 __analyzer_eval (buf
[42] == '\0'); /* { dg-warning "UNKNOWN" } */
66 /* As test_5, but with "__builtin___memset_chk". */
72 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "TRUE" } */
73 __builtin___memset_chk (buf
, 0, n
, __builtin_object_size (buf
, 0));
75 /* We can't know if buf[42] was overwritten by the memset or not. */
76 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "UNKNOWN" } */
77 __analyzer_eval (buf
[42] == '\0'); /* { dg-warning "UNKNOWN" } */
80 /* A "memset" with unknown value, but with zero size. */
82 static size_t __attribute__((noinline
))
92 memset (buf
, 'B', get_zero ());
93 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "TRUE" } */
96 void test_6b (int val
)
99 memset (buf
, 'A', sizeof (buf
));
100 memset (buf
, 'B', get_zero ());
101 __analyzer_eval (buf
[42] == 'A'); /* { dg-warning "TRUE" } */
104 /* A "memset" of known size that's not the full buffer. */
110 memset (buf
, 0, 128);
111 __analyzer_eval (buf
[0] == '\0'); /* { dg-warning "TRUE" } */
112 __analyzer_eval (buf
[127] == '\0'); /* { dg-warning "TRUE" } */
113 __analyzer_eval (buf
[128] == 'A'); /* { dg-warning "TRUE" } */
119 memset (buf
+ 0, 0, 1);
120 memset (buf
+ 1, 1, 1);
121 memset (buf
+ 2, 2, 1);
122 memset (buf
+ 3, 3, 1);
123 memset (buf
+ 4, 4, 2);
124 memset (buf
+ 6, 6, 2);
125 memset (buf
+ 8, 8, 4);
126 memset (buf
+ 12, 12, 8);
127 __analyzer_eval (buf
[0] == 0); /* { dg-warning "TRUE" } */
128 __analyzer_eval (buf
[1] == 1); /* { dg-warning "TRUE" } */
129 __analyzer_eval (buf
[2] == 2); /* { dg-warning "TRUE" } */
130 __analyzer_eval (buf
[3] == 3); /* { dg-warning "TRUE" } */
131 __analyzer_eval (buf
[4] == 4); /* { dg-warning "TRUE" } */
132 __analyzer_eval (buf
[5] == 4); /* { dg-warning "TRUE" } */
133 __analyzer_eval (buf
[6] == 6); /* { dg-warning "TRUE" } */
134 __analyzer_eval (buf
[7] == 6); /* { dg-warning "TRUE" } */
135 __analyzer_eval (buf
[8] == 8); /* { dg-warning "TRUE" } */
136 __analyzer_eval (buf
[9] == 8); /* { dg-warning "TRUE" } */
137 __analyzer_eval (buf
[10] == 8); /* { dg-warning "TRUE" } */
138 __analyzer_eval (buf
[11] == 8); /* { dg-warning "TRUE" } */
139 __analyzer_eval (buf
[12] == 12); /* { dg-warning "TRUE" } */
140 __analyzer_eval (buf
[13] == 12); /* { dg-warning "TRUE" } */
141 __analyzer_eval (buf
[14] == 12); /* { dg-warning "TRUE" } */
142 __analyzer_eval (buf
[15] == 12); /* { dg-warning "TRUE" } */
143 __analyzer_eval (buf
[16] == 12); /* { dg-warning "TRUE" } */
144 __analyzer_eval (buf
[17] == 12); /* { dg-warning "TRUE" } */
145 __analyzer_eval (buf
[18] == 12); /* { dg-warning "TRUE" } */
146 __analyzer_eval (buf
[19] == 12); /* { dg-warning "TRUE" } */
149 /* Various overlapping memset calls with different sizes and values. */
155 __analyzer_eval (buf
[0] == 0); /* { dg-warning "TRUE" } */
156 __analyzer_eval (buf
[1] == 0); /* { dg-warning "TRUE" } */
157 __analyzer_eval (buf
[2] == 0); /* { dg-warning "TRUE" } */
158 __analyzer_eval (buf
[3] == 0); /* { dg-warning "TRUE" } */
159 __analyzer_eval (buf
[4] == 0); /* { dg-warning "TRUE" } */
160 __analyzer_eval (buf
[5] == 0); /* { dg-warning "TRUE" } */
161 __analyzer_eval (buf
[6] == 0); /* { dg-warning "TRUE" } */
162 __analyzer_eval (buf
[7] == 0); /* { dg-warning "TRUE" } */
164 memset (buf
+ 1, 1, 4);
165 __analyzer_eval (buf
[0] == 0); /* { dg-warning "TRUE" } */
166 __analyzer_eval (buf
[1] == 1); /* { dg-warning "TRUE" } */
167 __analyzer_eval (buf
[2] == 1); /* { dg-warning "TRUE" } */
168 __analyzer_eval (buf
[3] == 1); /* { dg-warning "TRUE" } */
169 __analyzer_eval (buf
[4] == 1); /* { dg-warning "TRUE" } */
170 __analyzer_eval (buf
[5] == 0); /* { dg-warning "TRUE" } */
171 __analyzer_eval (buf
[6] == 0); /* { dg-warning "TRUE" } */
172 __analyzer_eval (buf
[7] == 0); /* { dg-warning "TRUE" } */
174 memset (buf
+ 2, 2, 4);
175 __analyzer_eval (buf
[0] == 0); /* { dg-warning "TRUE" } */
176 __analyzer_eval (buf
[1] == 1); /* { dg-warning "TRUE" } */
177 __analyzer_eval (buf
[2] == 2); /* { dg-warning "TRUE" } */
178 __analyzer_eval (buf
[3] == 2); /* { dg-warning "TRUE" } */
179 __analyzer_eval (buf
[4] == 2); /* { dg-warning "TRUE" } */
180 __analyzer_eval (buf
[5] == 2); /* { dg-warning "TRUE" } */
181 __analyzer_eval (buf
[6] == 0); /* { dg-warning "TRUE" } */
182 __analyzer_eval (buf
[7] == 0); /* { dg-warning "TRUE" } */
184 memset (buf
+ 4, 3, 3);
185 __analyzer_eval (buf
[0] == 0); /* { dg-warning "TRUE" } */
186 __analyzer_eval (buf
[1] == 1); /* { dg-warning "TRUE" } */
187 __analyzer_eval (buf
[2] == 2); /* { dg-warning "TRUE" } */
188 __analyzer_eval (buf
[3] == 2); /* { dg-warning "TRUE" } */
189 __analyzer_eval (buf
[4] == 3); /* { dg-warning "TRUE" } */
190 __analyzer_eval (buf
[5] == 3); /* { dg-warning "TRUE" } */
191 __analyzer_eval (buf
[6] == 3); /* { dg-warning "TRUE" } */
192 __analyzer_eval (buf
[7] == 0); /* { dg-warning "TRUE" } */
194 memset (buf
+ 0, 4, 3);
195 __analyzer_eval (buf
[0] == 4); /* { dg-warning "TRUE" } */
196 __analyzer_eval (buf
[1] == 4); /* { dg-warning "TRUE" } */
197 __analyzer_eval (buf
[2] == 4); /* { dg-warning "TRUE" } */
198 __analyzer_eval (buf
[3] == 2); /* { dg-warning "TRUE" } */
199 __analyzer_eval (buf
[4] == 3); /* { dg-warning "TRUE" } */
200 __analyzer_eval (buf
[5] == 3); /* { dg-warning "TRUE" } */
201 __analyzer_eval (buf
[6] == 3); /* { dg-warning "TRUE" } */
202 __analyzer_eval (buf
[7] == 0); /* { dg-warning "TRUE" } */