# V789. Iterators for the container, used in the range-based for loop, become invalid upon a function call.

Анализатор обнаружил инвалидацию итератора в range-based for цикле.

Пример:

    std::vector<int> numbers;
    for (int num : numbers)
    {
      numbers.push_back(num * 2);
    }

Данный код аналогичен следующему:

    for (auto __begin = begin(numbers), __end = end(numbers);
         __begin != __end; ++__begin) {
      int num = *__begin;
      numbers.push_back(num * 2);
    }

Теперь видно, что при операции 'push_back' может произойти инвалидация итераторов '__begin' и '__end', если произойдёт реаллокация памяти внутри вектора.

Если необходимо модифицировать контейнер и одновременно читать из него значения, лучше воспользоваться функциями, которые возвращают новый итератор после модификации, или индексами в случае класса 'std::vector'.

Дополнительные ссылки:

- https://stackoverflow.com/a/6442829 - правила инвалидации итераторов для STL контейнеров.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки управления динамической памятью (выделения, освобождения, использования освобожденной памяти) [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-672 CERT-CTR53-CPP

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V789.