Незавершение вызова

Вызванная функция не возвращается к вызову контекста

Описание

Это начинает работу, вызов функции появляется, когда следующие условия содержат:

  • Вызванная функция не возвращается к своему контексту вызова. Вызов приводит к определенной ошибке времени выполнения или функции завершения процесса как exit() в теле функции.

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

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

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

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

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

  • Перейдите к источнику ошибки в теле функции. Щелкните правой кнопкой по вызову функции и выберите Go to Cause, если опция существует.

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

Примеры

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

#include<stdio.h>
double ratio(int num, int den) {
  return(num/den);
}

void main() {
  int i,j;
  i=2;
  j=0;
  printf("%.2f",ratio(i,j));
}

В этом примере красная ошибка Division by zero появляется в теле ratio. Эта ошибка Division by zero в теле ratio вызывает пунктирное красное подчеркивание на вызове ratio.

#include<stdio.h>
double ratio(int num, int den) {
  return(num/den);
}

int inputCh();

void main() {
  int i,j,ch=inputCh();
  i=2;

  if(ch==1)  {
    j=0;
    printf("%.2f",ratio(i,j));
  }
  else {
    j=2;
    printf("%.2f",ratio(i,j));
  }
}

В этом примере существует два вызова ratio. В первом вызове ошибка Division by zero происходит в теле ratio. Во втором вызове Polyspace не находит ошибки. Поэтому комбинируя два вызова, оранжевая проверка Division by zero появляется в теле ratio. Красный Non-terminating call начинает работу, первый вызов указывает на ошибку.

typedef void (*f)(void);  
// function pointer type 

void f1(void) { 
  int x; 
  x++;   
} 

void f2(void) { } 
void f3(void) { } 

f fptr_array[3] = {f1,f2,f3}; 
unsigned char getIndex(void); 

void main(void) { 
 unsigned char index = getIndex() % 3; 
 // Index is between O and 2 

 fptr_array[index]();  
 fptr_array[index]();  
} 

В этом примере, потому что index может находиться между 0 и 2, первый fptr_array[index]() может вызвать f1, f2 или f3. Если index является нулем, оператор вызывает f1. f1 содержит красную ошибку Non-initialized local variable, поэтому, пунктирная красная ошибка появляется на вызове функции. В отличие от других красных ошибок, продолжается верификация.

После этого оператора программное обеспечение полагает, что index равняется или 1 или 2. Ошибка не происходит на втором fptr_array[index]().

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

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