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