blob: 1151838bb84331673f254e08eeb003557012ff79 [file] [log] [blame]
Adam Balogh21583b72018-09-10 09:03:22 +00001// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=false %s -verify
2// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify
Adam Balogh2cfbe932018-08-28 08:41:15 +00003
4#include "Inputs/system-header-simulator-cxx.h"
5
6void bad_copy_assign_operator_list1(std::list<int> &L1,
7 const std::list<int> &L2) {
8 auto i0 = L1.cbegin();
9 L1 = L2;
10 *i0; // expected-warning{{Invalidated iterator accessed}}
11}
12
13void bad_copy_assign_operator_vector1(std::vector<int> &V1,
14 const std::vector<int> &V2) {
15 auto i0 = V1.cbegin();
16 V1 = V2;
17 *i0; // expected-warning{{Invalidated iterator accessed}}
18}
19
20void bad_copy_assign_operator_deque1(std::deque<int> &D1,
21 const std::deque<int> &D2) {
22 auto i0 = D1.cbegin();
23 D1 = D2;
24 *i0; // expected-warning{{Invalidated iterator accessed}}
25}
26
27void bad_copy_assign_operator_forward_list1(std::forward_list<int> &FL1,
28 const std::forward_list<int> &FL2) {
29 auto i0 = FL1.cbegin();
30 FL1 = FL2;
31 *i0; // expected-warning{{Invalidated iterator accessed}}
32}
Adam Balogh9a48ba62018-09-10 09:06:31 +000033
Adam Balogh2e7cb342018-09-10 09:07:47 +000034void bad_assign_list1(std::list<int> &L, int n) {
35 auto i0 = L.cbegin();
36 L.assign(10, n);
37 *i0; // expected-warning{{Invalidated iterator accessed}}
38}
39
40void bad_assign_vector1(std::vector<int> &V, int n) {
41 auto i0 = V.cbegin();
42 V.assign(10, n);
43 *i0; // expected-warning{{Invalidated iterator accessed}}
44}
45
46void bad_assign_deque1(std::deque<int> &D, int n) {
47 auto i0 = D.cbegin();
48 D.assign(10, n);
49 *i0; // expected-warning{{Invalidated iterator accessed}}
50}
51
52void bad_assign_forward_list1(std::forward_list<int> &FL, int n) {
53 auto i0 = FL.cbegin();
54 FL.assign(10, n);
55 *i0; // expected-warning{{Invalidated iterator accessed}}
56}
57
58void good_clear_list1(std::list<int> &L) {
59 auto i0 = L.cend();
60 L.clear();
61 --i0; // no-warning
62}
63
64void bad_clear_list1(std::list<int> &L) {
65 auto i0 = L.cbegin(), i1 = L.cend();
66 L.clear();
67 *i0; // expected-warning{{Invalidated iterator accessed}}
68}
69
70void bad_clear_vector1(std::vector<int> &V) {
71 auto i0 = V.cbegin(), i1 = V.cend();
72 V.clear();
73 *i0; // expected-warning{{Invalidated iterator accessed}}
74 --i1; // expected-warning{{Invalidated iterator accessed}}
75}
76
77void bad_clear_deque1(std::deque<int> &D) {
78 auto i0 = D.cbegin(), i1 = D.cend();
79 D.clear();
80 *i0; // expected-warning{{Invalidated iterator accessed}}
81 --i1; // expected-warning{{Invalidated iterator accessed}}
82}
83
Adam Balogh9a48ba62018-09-10 09:06:31 +000084void good_push_back_list1(std::list<int> &L, int n) {
85 auto i0 = L.cbegin(), i1 = L.cend();
86 L.push_back(n);
87 *i0; // no-warning
88 --i1; // no-warning
89}
90
91void good_push_back_vector1(std::vector<int> &V, int n) {
92 auto i0 = V.cbegin(), i1 = V.cend();
93 V.push_back(n);
94 *i0; // no-warning
95}
96
97void bad_push_back_vector1(std::vector<int> &V, int n) {
98 auto i0 = V.cbegin(), i1 = V.cend();
99 V.push_back(n);
100 --i1; // expected-warning{{Invalidated iterator accessed}}
101}
102
103void bad_push_back_deque1(std::deque<int> &D, int n) {
104 auto i0 = D.cbegin(), i1 = D.cend();
105 D.push_back(n);
106 *i0; // expected-warning{{Invalidated iterator accessed}}
107 --i1; // expected-warning{{Invalidated iterator accessed}}
108}
109
110void good_emplace_back_list1(std::list<int> &L, int n) {
111 auto i0 = L.cbegin(), i1 = L.cend();
112 L.emplace_back(n);
113 *i0; // no-warning
114 --i1; // no-warning
115}
116
117void good_emplace_back_vector1(std::vector<int> &V, int n) {
118 auto i0 = V.cbegin(), i1 = V.cend();
119 V.emplace_back(n);
120 *i0; // no-warning
121}
122
123void bad_emplace_back_vector1(std::vector<int> &V, int n) {
124 auto i0 = V.cbegin(), i1 = V.cend();
125 V.emplace_back(n);
126 --i1; // expected-warning{{Invalidated iterator accessed}}
127}
128
129void bad_emplace_back_deque1(std::deque<int> &D, int n) {
130 auto i0 = D.cbegin(), i1 = D.cend();
131 D.emplace_back(n);
132 *i0; // expected-warning{{Invalidated iterator accessed}}
133 --i1; // expected-warning{{Invalidated iterator accessed}}
134}
135
136void good_pop_back_list1(std::list<int> &L, int n) {
137 auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
138 L.pop_back();
139 *i0; // no-warning
140 *i2; // no-warning
141}
142
143void bad_pop_back_list1(std::list<int> &L, int n) {
144 auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
145 L.pop_back();
146 *i1; // expected-warning{{Invalidated iterator accessed}}
147}
148
149void good_pop_back_vector1(std::vector<int> &V, int n) {
150 auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
151 V.pop_back();
152 *i0; // no-warning
153}
154
155void bad_pop_back_vector1(std::vector<int> &V, int n) {
156 auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
157 V.pop_back();
158 *i1; // expected-warning{{Invalidated iterator accessed}}
159 --i2; // expected-warning{{Invalidated iterator accessed}}
160}
161
162void good_pop_back_deque1(std::deque<int> &D, int n) {
163 auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
164 D.pop_back();
165 *i0; // no-warning
166}
167
168void bad_pop_back_deque1(std::deque<int> &D, int n) {
169 auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
170 D.pop_back();
171 *i1; // expected-warning{{Invalidated iterator accessed}}
172 --i2; // expected-warning{{Invalidated iterator accessed}}
173}
174
175void good_push_front_list1(std::list<int> &L, int n) {
176 auto i0 = L.cbegin(), i1 = L.cend();
177 L.push_front(n);
178 *i0; // no-warning
179 --i1; // no-warning
180}
181
182void bad_push_front_deque1(std::deque<int> &D, int n) {
183 auto i0 = D.cbegin(), i1 = D.cend();
184 D.push_front(n);
185 *i0; // expected-warning{{Invalidated iterator accessed}}
186 --i1; // expected-warning{{Invalidated iterator accessed}}
187}
188
189void good_push_front_forward_list1(std::forward_list<int> &FL, int n) {
190 auto i0 = FL.cbegin(), i1 = FL.cend();
191 FL.push_front(n);
192 *i0; // no-warning
193}
194
195void good_emplace_front_list1(std::list<int> &L, int n) {
196 auto i0 = L.cbegin(), i1 = L.cend();
197 L.emplace_front(n);
198 *i0; // no-warning
199 --i1; // no-warning
200}
201
202void bad_emplace_front_deque1(std::deque<int> &D, int n) {
203 auto i0 = D.cbegin(), i1 = D.cend();
204 D.emplace_front(n);
205 *i0; // expected-warning{{Invalidated iterator accessed}}
206 --i1; // expected-warning{{Invalidated iterator accessed}}
207}
208
209void good_emplace_front_forward_list1(std::forward_list<int> &FL, int n) {
210 auto i0 = FL.cbegin(), i1 = FL.cend();
211 FL.emplace_front(n);
212 *i0; // no-warning
213}
214
215void good_pop_front_list1(std::list<int> &L, int n) {
216 auto i1 = L.cbegin(), i0 = i1++;
217 L.pop_front();
218 *i1; // no-warning
219}
220
221void bad_pop_front_list1(std::list<int> &L, int n) {
222 auto i1 = L.cbegin(), i0 = i1++;
223 L.pop_front();
224 *i0; // expected-warning{{Invalidated iterator accessed}}
225}
226
227void good_pop_front_deque1(std::deque<int> &D, int n) {
228 auto i1 = D.cbegin(), i0 = i1++;
229 D.pop_front();
230 *i1; // no-warning
231}
232
233void bad_pop_front_deque1(std::deque<int> &D, int n) {
234 auto i1 = D.cbegin(), i0 = i1++;
235 D.pop_front();
236 *i0; // expected-warning{{Invalidated iterator accessed}}
237}
238
239void good_pop_front_forward_list1(std::forward_list<int> &FL, int n) {
240 auto i1 = FL.cbegin(), i0 = i1++;
241 FL.pop_front();
242 *i1; // no-warning
243}
244
245void bad_pop_front_forward_list1(std::forward_list<int> &FL, int n) {
246 auto i1 = FL.cbegin(), i0 = i1++;
247 FL.pop_front();
248 *i0; // expected-warning{{Invalidated iterator accessed}}
249}
Adam Balogh2e7cb342018-09-10 09:07:47 +0000250
251void good_insert_list1(std::list<int> &L, int n) {
252 auto i1 = L.cbegin(), i0 = i1++;
253 L.insert(i1, n);
254 *i0; // no-warning
255 *i1; // no-warning
256}
257
258void good_insert_vector1(std::vector<int> &V, int n) {
259 auto i1 = V.cbegin(), i0 = i1++;
260 V.insert(i1, n);
261 *i0; // no-warning
262}
263
264void bad_insert_vector1(std::vector<int> &V, int n) {
265 auto i1 = V.cbegin(), i0 = i1++;
266 V.insert(i1, n);
267 *i1; // expected-warning{{Invalidated iterator accessed}}
268}
269
270void bad_insert_deque1(std::deque<int> &D, int n) {
271 auto i1 = D.cbegin(), i0 = i1++;
272 D.insert(i1, n);
273 *i0; // expected-warning{{Invalidated iterator accessed}}
274 *i1; // expected-warning{{Invalidated iterator accessed}}
275}
276
277void good_emplace_list1(std::list<int> &L, int n) {
278 auto i1 = L.cbegin(), i0 = i1++;
279 L.emplace(i1, n);
280 *i0; // no-warning
281 *i1; // no-warning
282}
283
284void good_emplace_vector1(std::vector<int> &V, int n) {
285 auto i1 = V.cbegin(), i0 = i1++;
286 V.emplace(i1, n);
287 *i0; // no-warning
288}
289
290void bad_emplace_vector1(std::vector<int> &V, int n) {
291 auto i1 = V.cbegin(), i0 = i1++;
292 V.emplace(i1, n);
293 *i1; // expected-warning{{Invalidated iterator accessed}}
294}
295
296void bad_emplace_deque1(std::deque<int> &D, int n) {
297 auto i1 = D.cbegin(), i0 = i1++;
298 D.emplace(i1, n);
299 *i0; // expected-warning{{Invalidated iterator accessed}}
300 *i1; // expected-warning{{Invalidated iterator accessed}}
301}
302
303void good_erase_list1(std::list<int> &L) {
304 auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
305 L.erase(i1);
306 *i0; // no-warning
307 *i2; // no-warning
308}
309
310void bad_erase_list1(std::list<int> &L) {
311 auto i0 = L.cbegin();
312 L.erase(i0);
313 *i0; // expected-warning{{Invalidated iterator accessed}}
314}
315
316void good_erase_vector1(std::vector<int> &V) {
317 auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
318 V.erase(i1);
319 *i0; // no-warning
320}
321
322void bad_erase_vector1(std::vector<int> &V) {
323 auto i1 = V.cbegin(), i0 = i1++;
324 V.erase(i0);
325 *i0; // expected-warning{{Invalidated iterator accessed}}
326 *i1; // expected-warning{{Invalidated iterator accessed}}
327}
328
329void bad_erase_deque1(std::deque<int> &D) {
330 auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
331 D.erase(i1);
332 *i0; // expected-warning{{Invalidated iterator accessed}}
333 *i1; // expected-warning{{Invalidated iterator accessed}}
334 *i2; // expected-warning{{Invalidated iterator accessed}}
335}
336
337void good_erase_list2(std::list<int> &L) {
338 auto i3 = L.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
339 L.erase(i1, i3);
340 *i0; // no-warning
341 *i3; // no-warning
342}
343
344void bad_erase_list2(std::list<int> &L) {
345 auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
346 L.erase(i0, i2);
347 *i0; // expected-warning{{Invalidated iterator accessed}}
348 *i1; // expected-warning{{Invalidated iterator accessed}}
349}
350
351void good_erase_vector2(std::vector<int> &V) {
352 auto i3 = V.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;;
353 V.erase(i1, i3);
354 *i0; // no-warning
355}
356
357void bad_erase_vector2(std::vector<int> &V) {
358 auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
359 V.erase(i0, i2);
360 *i0; // expected-warning{{Invalidated iterator accessed}}
361 *i1; // expected-warning{{Invalidated iterator accessed}}
362 *i2; // expected-warning{{Invalidated iterator accessed}}
363}
364
365void bad_erase_deque2(std::deque<int> &D) {
366 auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
367 D.erase(i1, i3);
368 *i0; // expected-warning{{Invalidated iterator accessed}}
369 *i1; // expected-warning{{Invalidated iterator accessed}}
370 *i2; // expected-warning{{Invalidated iterator accessed}}
371 *i3; // expected-warning{{Invalidated iterator accessed}}
372}
373
374void good_erase_after_forward_list1(std::forward_list<int> &FL) {
375 auto i2 = FL.cbegin(), i0 = i2++, i1 = i2++;
376 FL.erase_after(i0);
377 *i0; // no-warning
378 *i2; // no-warning
379}
380
381void bad_erase_after_forward_list1(std::forward_list<int> &FL) {
382 auto i1 = FL.cbegin(), i0 = i1++;
383 FL.erase_after(i0);
384 *i1; // expected-warning{{Invalidated iterator accessed}}
385}
386
387void good_erase_after_forward_list2(std::forward_list<int> &FL) {
388 auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
389 FL.erase_after(i0, i3);
390 *i0; // no-warning
391 *i3; // no-warning
392}
393
394void bad_erase_after_forward_list2(std::forward_list<int> &FL) {
395 auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
396 FL.erase_after(i0, i3);
397 *i1; // expected-warning{{Invalidated iterator accessed}}
398 *i2; // expected-warning{{Invalidated iterator accessed}}
399}