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:

According to Common Weakness Enumeration, potential errors found by using this diagnostic are classified as CWE-672.

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


Bugs Found

Checked Projects
344
Collected Errors
12 970