Идентифицируйте операцию цикла с ошибкой времени выполнения

Этот пример показывает, как интерпретировать результаты Polyspace® Code Prover™, которые подсвечивают ошибку времени выполнения в цикле.

Если ошибка происходит в цикле, ошибка показывает в результатах анализа, когда красный Non-terminating loop проверяет ключевое слово цикла (for, while, и так далее).

for (i = 0; i <= 10; i++) 
Операция, вызывающая ошибку, показывает оранжевой регистрацией цикла. Чтобы отличить эту оранжевую проверку от других оранжевых регистраций цикла, перейдите непосредственно от красного ключевого слова цикла до операции, ответственной за ошибку времени выполнения.

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

  1. Запустите верификацию на этом коде и откройте результаты:

    int a[100];
    
    int f (int i);
    
    void main() {
      int i,x=0;
      for (i = 0; i <= 10; i++) {
        x += f(i);
      }
    }
    
    int f (int i) {
      int j, x;
      x = 0;
      for (j = 0; j <= 10; j++) {
        x += a[10 + (i * j)];
      }
      return x;
    }

  2. Выберите красный результат Non-terminating loop. Панель Source подсвечивает цикл for в main.

  3. Проследите от цикла for в main к операции, вызывающей ошибку. Операцией является x+= a[10 + (i*j)]. Ошибка Out of bounds array index происходит, когда i равняется 9, и j равняется 10. Ошибка отображает оранжевым на операторе [.

    Прослеживать от красного ключевого слова for до оранжевой операции доступа к массиву:

    • Перейдите непосредственно к операции. Щелкните правой кнопкой по ключевому слову for и выберите Go to Cause.

    • См. полную историю от ключевого слова for до операции доступа к массиву. Выберите красное ключевое слово for. Панель Result Details показывает историю.

      Можно считать историю события в последовательности. Цикл внешнего цикла запускается девять раз без ошибки. На десятой итерации (i=9) цикл вводит функциональный f. В f внутренний цикл запускается десять раз без ошибки. На одиннадцатой итерации (j=10) доступ к массиву вызывает ошибку.

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

Примечание

Можно переместиться непосредственно к первопричине ошибки по циклам for только с небольшим количеством итераций.

Смотрите также

Связанные примеры

Больше о