Non-terminating call

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

Описание

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

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

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

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

В противном случае, если все вызовы функции приводят к определенной ошибке или обработке функции завершения в теле функции, ошибка Non-terminating call не отображается. Ошибка появляется красным цветом в теле функции, и на вызовах функции появляется штриховое красное подчеркивание. Однако после вызова функции, как и другие красные ошибки, 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