blob: 778a8e01d99380ced8005e6dc926aa163249d803 [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
Adam Balogh12f5c7f2019-08-29 09:35:47 +00006void clang_analyzer_warnIfReached();
7
Adam Balogh23022b92019-11-08 12:52:09 +01008void normal_dereference(std::vector<int> &V) {
9 auto i = V.cbegin();
10 *i; // no-warning
Adam Balogh2cfbe932018-08-28 08:41:15 +000011}
12
Adam Balogh23022b92019-11-08 12:52:09 +010013void invalidated_dereference(std::vector<int> &V) {
14 auto i = V.cbegin();
15 V.erase(i);
16 *i; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2cfbe932018-08-28 08:41:15 +000017}
18
Adam Balogh23022b92019-11-08 12:52:09 +010019void normal_prefix_increment(std::vector<int> &V) {
20 auto i = V.cbegin();
21 ++i; // no-warning
Adam Balogh2cfbe932018-08-28 08:41:15 +000022}
23
Adam Balogh23022b92019-11-08 12:52:09 +010024void invalidated_prefix_increment(std::vector<int> &V) {
25 auto i = V.cbegin();
26 V.erase(i);
27 ++i; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2cfbe932018-08-28 08:41:15 +000028}
Adam Balogh9a48ba62018-09-10 09:06:31 +000029
Adam Balogh23022b92019-11-08 12:52:09 +010030void normal_prefix_decrement(std::vector<int> &V) {
31 auto i = ++V.cbegin();
32 --i; // no-warning
Adam Balogh2e7cb342018-09-10 09:07:47 +000033}
34
Adam Balogh23022b92019-11-08 12:52:09 +010035void invalidated_prefix_decrement(std::vector<int> &V) {
36 auto i = ++V.cbegin();
37 V.erase(i);
38 --i; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000039}
40
Adam Balogh23022b92019-11-08 12:52:09 +010041void normal_postfix_increment(std::vector<int> &V) {
42 auto i = V.cbegin();
43 i++; // no-warning
Adam Balogh2e7cb342018-09-10 09:07:47 +000044}
45
Adam Balogh23022b92019-11-08 12:52:09 +010046void invalidated_postfix_increment(std::vector<int> &V) {
47 auto i = V.cbegin();
48 V.erase(i);
49 i++; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000050}
51
Adam Balogh23022b92019-11-08 12:52:09 +010052void normal_postfix_decrement(std::vector<int> &V) {
53 auto i = ++V.cbegin();
54 i--; // no-warning
Adam Balogh2e7cb342018-09-10 09:07:47 +000055}
56
Adam Balogh23022b92019-11-08 12:52:09 +010057void invalidated_postfix_decrement(std::vector<int> &V) {
58 auto i = ++V.cbegin();
59 V.erase(i);
60 i--; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000061}
62
Adam Balogh23022b92019-11-08 12:52:09 +010063void normal_increment_by_2(std::vector<int> &V) {
64 auto i = V.cbegin();
65 i += 2; // no-warning
Adam Balogh12f5c7f2019-08-29 09:35:47 +000066}
67
Adam Balogh23022b92019-11-08 12:52:09 +010068void invalidated_increment_by_2(std::vector<int> &V) {
69 auto i = V.cbegin();
70 V.erase(i);
71 i += 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000072}
73
Adam Balogh23022b92019-11-08 12:52:09 +010074void normal_increment_by_2_copy(std::vector<int> &V) {
75 auto i = V.cbegin();
76 auto j = i + 2; // no-warning
Adam Balogh12f5c7f2019-08-29 09:35:47 +000077}
78
Adam Balogh23022b92019-11-08 12:52:09 +010079void invalidated_increment_by_2_copy(std::vector<int> &V) {
80 auto i = V.cbegin();
81 V.erase(i);
82 auto j = i + 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000083}
84
Adam Balogh23022b92019-11-08 12:52:09 +010085void normal_decrement_by_2(std::vector<int> &V) {
86 auto i = V.cbegin();
87 i -= 2; // no-warning
Adam Balogh9a48ba62018-09-10 09:06:31 +000088}
89
Adam Balogh23022b92019-11-08 12:52:09 +010090void invalidated_decrement_by_2(std::vector<int> &V) {
91 auto i = V.cbegin();
92 V.erase(i);
93 i -= 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh9a48ba62018-09-10 09:06:31 +000094}
95
Adam Balogh23022b92019-11-08 12:52:09 +010096void normal_decrement_by_2_copy(std::vector<int> &V) {
97 auto i = V.cbegin();
98 auto j = i - 2; // no-warning
Adam Balogh9a48ba62018-09-10 09:06:31 +000099}
100
Adam Balogh23022b92019-11-08 12:52:09 +0100101void invalidated_decrement_by_2_copy(std::vector<int> &V) {
102 auto i = V.cbegin();
103 V.erase(i);
104 auto j = i - 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000105}
106
Adam Balogh23022b92019-11-08 12:52:09 +0100107void normal_subscript(std::vector<int> &V) {
108 auto i = V.cbegin();
109 i[1]; // no-warning
Adam Balogh9a48ba62018-09-10 09:06:31 +0000110}
111
Adam Balogh23022b92019-11-08 12:52:09 +0100112void invalidated_subscript(std::vector<int> &V) {
113 auto i = V.cbegin();
114 V.erase(i);
115 i[1]; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh9a48ba62018-09-10 09:06:31 +0000116}
117
Adam Balogh23022b92019-11-08 12:52:09 +0100118void assignment(std::vector<int> &V) {
119 auto i = V.cbegin();
120 V.erase(i);
121 auto j = V.cbegin(); // no-warning
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000122}
Adam Balogh9e63b192020-06-16 20:00:47 +0200123
124template<typename T>
125struct cont_with_ptr_iterator {
126 T *begin() const;
127 T *end() const;
128 T &operator[](size_t);
129 void push_back(const T&);
130 T* erase(T*);
131};
132
133void invalidated_dereference_end_ptr_iterator(cont_with_ptr_iterator<int> &C) {
134 auto i = C.begin();
135 C.erase(i);
136 (void) *i; // expected-warning{{Invalidated iterator accessed}}
137}
138
139void invalidated_prefix_increment_end_ptr_iterator(
140 cont_with_ptr_iterator<int> &C) {
141 auto i = C.begin();
142 C.erase(i);
143 ++i; // expected-warning{{Invalidated iterator accessed}}
144}
145
146void invalidated_prefix_decrement_end_ptr_iterator(
147 cont_with_ptr_iterator<int> &C) {
148 auto i = C.begin() + 1;
149 C.erase(i);
150 --i; // expected-warning{{Invalidated iterator accessed}}
151}
152
153void invalidated_postfix_increment_end_ptr_iterator(
154 cont_with_ptr_iterator<int> &C) {
155 auto i = C.begin();
156 C.erase(i);
157 i++; // expected-warning{{Invalidated iterator accessed}}
158}
159
160void invalidated_postfix_decrement_end_ptr_iterator(
161 cont_with_ptr_iterator<int> &C) {
162 auto i = C.begin() + 1;
163 C.erase(i);
164 i--; // expected-warning{{Invalidated iterator accessed}}
165}
166
167void invalidated_increment_by_2_end_ptr_iterator(
168 cont_with_ptr_iterator<int> &C) {
169 auto i = C.begin();
170 C.erase(i);
171 i += 2; // expected-warning{{Invalidated iterator accessed}}
172}
173
174void invalidated_increment_by_2_copy_end_ptr_iterator(
175 cont_with_ptr_iterator<int> &C) {
176 auto i = C.begin();
177 C.erase(i);
178 auto j = i + 2; // expected-warning{{Invalidated iterator accessed}}
179}
180
181void invalidated_decrement_by_2_end_ptr_iterator(
182 cont_with_ptr_iterator<int> &C) {
183 auto i = C.begin();
184 C.erase(i);
185 i -= 2; // expected-warning{{Invalidated iterator accessed}}
186}
187
188void invalidated_decrement_by_2_copy_end_ptr_iterator(
189 cont_with_ptr_iterator<int> &C) {
190 auto i = C.begin();
191 C.erase(i);
192 auto j = i - 2; // expected-warning{{Invalidated iterator accessed}}
193}
194
195void invalidated_subscript_end_ptr_iterator(cont_with_ptr_iterator<int> &C) {
196 auto i = C.begin();
197 C.erase(i);
198 (void) i[1]; // expected-warning{{Invalidated iterator accessed}}
199}