Clang Project

clang_source_code/test/Analysis/invalidated-iterator.cpp
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
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}
33
34void 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
84void 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}
250
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}
400