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'.

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

Согласно Common Weakness Enumeration, потенциальные ошибки, найденные с помощью этой диагностики, классифицируются как CWE-672.

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


Найденные ошибки

Проверено проектов
354
Собрано ошибок
13 290

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;