// 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);
}