exponenta event banner

Петля без завершения

Цикл не завершается или содержит ошибку

Описание

Эта проверка цикла определяет, имеет ли цикл одну из следующих проблем:

  • Петля определенно не заканчивается.

    Проверка появляется только в том случае, если Polyspace ® не может обнаружить путь выхода из цикла. Например, если цикл появляется в функции и условие завершения цикла выполняется для некоторых входов функции, проверка не появляется, даже если условие может не выполняться для некоторых других входов.

  • Цикл содержит определенную ошибку в одной из своих итераций.

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

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

Проверка также не появляется, если выполняются оба условия:

  • Цикл имеет тривиальный предикат, такой как for(;;) или while(1).

  • Цикл имеет пустое тело или тело без оператора exit, например break, goto, return или исключение.

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

С помощью этой проверки можно определить операцию в цикле, которая вызывает ошибку времени выполнения.

  • Чтобы найти источник ошибки, на панели Источник установите курсор на вызове функции и просмотрите подсказку.

  • Для циклов с меньшим количеством итераций можно перейти к источнику ошибки в теле цикла. Выберите цикл, чтобы просмотреть полную историю результата. Либо щелкните правой кнопкой мыши ключевое слово цикла и выберите Перейти к причине (Go to Cause), если опция существует.

Примеры

развернуть все

#include<stdio.h>

void main() {
  int i=0;
  while(i<10) {
    printf("%d",i);
  }
}

В этом примере в while петля, i не увеличивается. Поэтому тест i<10 никогда не терпит неудачу.

Исправление - Обеспечение окончания шлейфа

Одной из возможных корректировок является обновление i такой, чтобы тест i<10 сбой после некоторых итераций цикла и завершения цикла.

#include<stdio.h>

void main() {
  int i=0;
  while(i < 10) {
    printf("%d",i);
    i++;
  }
}
void main() {
  int arr[20];
  for(int i=0; i<=20; i++) {
    arr[i]=0;
  }
}

В этом примере последний прогон for цикл содержит ошибку индекса массива Out of bounds. Поэтому проверка шлейфа Non-terminating на for петля красного цвета. Всплывающая подсказка появляется на for цикл, указывающий максимальное количество итераций, включая ту, которая содержит ошибку времени выполнения.

Исправление - Избегайте итерации цикла, содержащей ошибку

Одной из возможных корректировок является уменьшение числа итераций цикла, так что ошибка индекса массива Out of bounds не возникает.

void main() {
  int arr[20];
  for(int i=0; i<20; i++) {
    arr[i]=0;
  }
}
int arr[4];

void assignValue(int index) {
  arr[index] = 0;
}

void main() {
  for(int i=0;i<=4;i++)
    assignValue(i);
}

В этом примере вызов функции assignValue в последнем for итерация цикла содержит ошибку. Поэтому, хотя ошибка не отображается в for loop body, красный Non-terminating loop появляется на самом цикле.

Исправление - Избегайте итерации цикла, содержащей ошибку

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

int arr[4];

void assignValue(int index) {
  arr[index] = 0;
}

void main() {
 for(int i=0;i<4;i++)
   assignValue(i);
}
#define MAX 1024
void main() {
 int i=0,val=1;
 while(i<MAX) {
   val*=2;
   i++;
  }
}

В этом примере ошибка переполнения возникает в итерации номер 31. Поэтому проверка шлейфа Non-terminating на while петля красного цвета. Всплывающая подсказка появляется на while цикл, указывающий максимальное количество итераций, включая ту, которая содержит ошибку времени выполнения.

Коррекция - уменьшение итераций цикла

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

#define MAX 30
void main() {
 int i=0,val=1;
 while(i<MAX) {
   val*=2;
   i++;
  }
}

Проверить информацию

Группа: Поток управления
Язык: C | C++
Акроним: NTL