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

The analyzer has detected invalidation of an iterator in a range-based 'for' loop.

Consider the following example:

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

This code fragment does the same as this one:

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

With the code rewritten in that way, it becomes obvious that the iterators '__begin' and '__end' can be invalidated when executing the 'push_back' function if memory is reallocated inside the vector.

If you simultaneously need to modify the container and read values from it, it is better to use functions that return a new iterator after modification, or indexes in the case of the 'std::vector' class.

References:

- https://stackoverflow.com/a/6442829 - iterator invalidation rules for STL containers.

This diagnostic is classified as:

CWE-672 CERT-CTR53-CPP

You can look at examples of errors detected by the V789 diagnostic.