exponenta event banner

Не завершающий вызов

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

Описание

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

  • Вызываемая функция не возвращается в контекст вызова. Вызов приводит к определенной ошибке времени выполнения или функции завершения процесса, такой как 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. Это деление по нулевой ошибке в теле 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. Красная проверка вызова без завершения при первом вызове указывает на ошибку.

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

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

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

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