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 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 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 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 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 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 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 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 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 58 void good_clear_list1(std::list<int> &L) { 59 auto i0 = L.cend(); 60 L.clear(); 61 --i0; // no-warning 62 } 63 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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