Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08
Анализатор обнаружил потенциально бесконечный цикл, условие выхода из которого зависит от переменной, значение которой никогда не меняется в теле цикла.
Рассмотрим пример:
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.
Диагностическое правило классифицируется как:
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок: