1 // 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
3
4 #include "Inputs/system-header-simulator-cxx.h"
5
bad_copy_assign_operator_list1(std::list<int> & L1,const std::list<int> & L2)6 void 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
bad_copy_assign_operator_vector1(std::vector<int> & V1,const std::vector<int> & V2)13 void 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
bad_copy_assign_operator_deque1(std::deque<int> & D1,const std::deque<int> & D2)20 void 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
bad_copy_assign_operator_forward_list1(std::forward_list<int> & FL1,const std::forward_list<int> & FL2)27 void 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 }
33
bad_assign_list1(std::list<int> & L,int n)34 void 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
bad_assign_vector1(std::vector<int> & V,int n)40 void 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
bad_assign_deque1(std::deque<int> & D,int n)46 void 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
bad_assign_forward_list1(std::forward_list<int> & FL,int n)52 void 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
good_clear_list1(std::list<int> & L)58 void good_clear_list1(std::list<int> &L) {
59 auto i0 = L.cend();
60 L.clear();
61 --i0; // no-warning
62 }
63
bad_clear_list1(std::list<int> & L)64 void 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
bad_clear_vector1(std::vector<int> & V)70 void 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
bad_clear_deque1(std::deque<int> & D)77 void 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
good_push_back_list1(std::list<int> & L,int n)84 void 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
good_push_back_vector1(std::vector<int> & V,int n)91 void 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
bad_push_back_vector1(std::vector<int> & V,int n)97 void 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
bad_push_back_deque1(std::deque<int> & D,int n)103 void 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
good_emplace_back_list1(std::list<int> & L,int n)110 void 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
good_emplace_back_vector1(std::vector<int> & V,int n)117 void 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
bad_emplace_back_vector1(std::vector<int> & V,int n)123 void 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
bad_emplace_back_deque1(std::deque<int> & D,int n)129 void 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
good_pop_back_list1(std::list<int> & L,int n)136 void 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
bad_pop_back_list1(std::list<int> & L,int n)143 void 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
good_pop_back_vector1(std::vector<int> & V,int n)149 void 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
bad_pop_back_vector1(std::vector<int> & V,int n)155 void 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
good_pop_back_deque1(std::deque<int> & D,int n)162 void 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
bad_pop_back_deque1(std::deque<int> & D,int n)168 void 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
good_push_front_list1(std::list<int> & L,int n)175 void 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
bad_push_front_deque1(std::deque<int> & D,int n)182 void 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
good_push_front_forward_list1(std::forward_list<int> & FL,int n)189 void 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
good_emplace_front_list1(std::list<int> & L,int n)195 void 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
bad_emplace_front_deque1(std::deque<int> & D,int n)202 void 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
good_emplace_front_forward_list1(std::forward_list<int> & FL,int n)209 void 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
good_pop_front_list1(std::list<int> & L,int n)215 void 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
bad_pop_front_list1(std::list<int> & L,int n)221 void 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
good_pop_front_deque1(std::deque<int> & D,int n)227 void 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
bad_pop_front_deque1(std::deque<int> & D,int n)233 void 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
good_pop_front_forward_list1(std::forward_list<int> & FL,int n)239 void 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
bad_pop_front_forward_list1(std::forward_list<int> & FL,int n)245 void 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 }
250
good_insert_list1(std::list<int> & L,int n)251 void 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
good_insert_vector1(std::vector<int> & V,int n)258 void 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
bad_insert_vector1(std::vector<int> & V,int n)264 void 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
bad_insert_deque1(std::deque<int> & D,int n)270 void 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
good_emplace_list1(std::list<int> & L,int n)277 void 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
good_emplace_vector1(std::vector<int> & V,int n)284 void 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
bad_emplace_vector1(std::vector<int> & V,int n)290 void 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
bad_emplace_deque1(std::deque<int> & D,int n)296 void 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
good_erase_list1(std::list<int> & L)303 void 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
bad_erase_list1(std::list<int> & L)310 void 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
good_erase_vector1(std::vector<int> & V)316 void 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
bad_erase_vector1(std::vector<int> & V)322 void 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
bad_erase_deque1(std::deque<int> & D)329 void 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
good_erase_list2(std::list<int> & L)337 void 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
bad_erase_list2(std::list<int> & L)344 void 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
good_erase_vector2(std::vector<int> & V)351 void 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
bad_erase_vector2(std::vector<int> & V)357 void 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
bad_erase_deque2(std::deque<int> & D)365 void 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
good_erase_after_forward_list1(std::forward_list<int> & FL)374 void 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
bad_erase_after_forward_list1(std::forward_list<int> & FL)381 void 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
good_erase_after_forward_list2(std::forward_list<int> & FL)387 void 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
bad_erase_after_forward_list2(std::forward_list<int> & FL)394 void 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 }
400