| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include <algorithm> |
| #include <vector> |
| |
| void IteratorUsedAfterErase(std::vector<int>& v) { |
| auto it = std::begin(v); |
| for (; it != std::end(v); ++it) { |
| // Note that this access is valid, because we theoretically always check it |
| // against `end` before going here. |
| if (*it > 3) { |
| // Calling `erase` invalidates `it`, and the next loop iteration will use |
| // it via `++it`. |
| // To fix this error: |
| // it = v.erase(it); |
| v.erase(it); |
| } |
| } |
| } |
| |
| void IteratorUsedAfterPushBack(std::vector<int>& v) { |
| auto it = std::begin(v); |
| // Note that `*it == 3` is valid here because we first checked it against |
| // `end`. |
| if (it != std::end(v) && *it == 3) { |
| // Similarly here, push_back invalidates all the previous iterators. |
| v.push_back(4); |
| } |
| // Invalid because we might have entered the condition block. |
| ++it; |
| } |
| |
| void IteratorsMismatched(std::vector<int>& v1, std::vector<int>& v2) { |
| auto it = std::find(std::begin(v1), std::end(v1), 3); |
| |
| // Invalid because mismatched iterators. |
| v2.erase(it); |
| } |