Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08

menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V776. Potentially infinite loop. The variable in the loop exit condition does not change its value between iterations.

06 Дек 2016

Анализатор обнаружил потенциально бесконечный цикл, условие выхода из которого зависит от переменной, значение которой никогда не меняется в теле цикла.

Рассмотрим пример:

int Do(int x);
....
int n = Foo();
int x = 0;
while (x < n)
{
  Do(x);
}

Условие выхода из цикла зависит от переменной x, значение которой в цикле всегда будет равно нулю. При n > 0, проверка x < n всегда будет истинной, что приведет к бесконечному циклу.

Исправленный вариант:

int Do(int x);
....
int n = Foo();
int x = 0;
while (x < n)
{
  x = Do(x);
}

Рассмотрим еще один пример. Условие выхода из цикла зависит от переменной, изменение значения которой зависит от других переменных, которые никогда не меняются в теле цикла.

int Foo(int a)
{
  int j = 0;
  while (true)
  {
    if (a >= 32)
    {
      return j * a;
    }

    if (j == 10)
    {
      j = 0;
    }

    j++;
  }
}

Условие выхода из цикла зависит от параметра a. В случае если параметр a не будет удовлетворять условию проверки a >= 32, то цикл будет бесконечным, так как значение a в теле цикла не изменяется.

Корректный вариант:

int Foo(int a)
{
  int j = 0;
  while (true)
  {
    if (a >= 32)
    {
      return j * a;
    }

    if (j == 10)
    {
      j = 0;
      a++; // <=
    }

    j++;
  }
}

Таким образом изменение параметра a будет зависеть от локальной переменной j.

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