# V714. Variable is not passed into foreach loop by reference, but its value is changed inside of the loop.

Анализатор обнаружил в коде подозрительную ситуацию. Присутствует foreach, в котором имеется присваивание контрольной переменной цикла (loop control variable) некоторого значения. В то же время, передача контрольной переменной цикла идёт по значению. Скорее всего, имелась в виду передача по ссылке.

Пример:

    for (auto t : myvector)
      t = 17;

Это приведёт к копированию переменной 't' на каждой итерации и изменению локальной копии, что вряд ли то, что хотел программист. Скорее всего, хотелось изменить значения в контейнере 'myvector'. Корректно данный участок кода будет выглядеть следующим образом:

    for (auto & t : myvector)
      t = 17;

Данная диагностика диагностирует лишь самые простые случаи некорректного использования цикла foreach, поскольку в них проще всего совершить ошибку. В случае более сложных конструкций программист наверняка лучше знает, что он делает и следующие ситуации иногда встречаются в реальном коде:

    for (auto t : myvector)
    {
      function(t); // Использовали t по назначению
      // Далее t используется как локальная переменная
      t = anotherFunction();
      if (t)
        break;
    }

На этот код анализатор не будет выдавать предупреждение V714.

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

CWE-563 CERT-MSC13-C

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