Функция, не достижимая

Функция вызвана от недостижимой части кода

Описание

Эта проверка появляется на функциональном определении. Проверка кажется серой, если функция вызвана только от недостижимой части кода. Недостижимый код может произойти одним из следующих способов:

  • Код достигнут через условие, которое является всегда ложным.

  • Код следует за оператором break или return.

  • Код следует за красной проверкой.

Если ваш код не содержит функцию main, эта проверка отключена

Примечание

Эта проверка не включена по умолчанию. Чтобы включить эту проверку, необходимо задать соответствующую аналитическую опцию. Для получения дополнительной информации смотрите Detect uncalled functions (-uncalled-function-checks).

Примеры

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

#include<stdio.h>
#define SIZE 100

void increase(int* arr, int index);

void printError()
{
  printf("Array index exceeds array size.");
}

void main() {
  int arr[SIZE],i;
  for(i=0; i<SIZE; i++)
    arr[i]=0;

  for(i=0; i<SIZE; i++) {
    if(i<SIZE)
      increase(arr,i);
    else
      printError();
  }
}

В этом примере, во втором цикле for в main, i всегда является меньше, чем SIZE. Поэтому ответвление else условия if(i<SIZE) никогда не достигается. Поскольку функциональный printError называется от одного только ответвления else, существует серый Function not reachable, проверяют определение printError.

#include<stdio.h>

int getNum(void);

void printSuccess()
{
  printf("The operation is complete.");
}

void main() {
  int num=getNum(), den=0;
  printf("The ratio is %.2f", num/den);
  printSuccess();
}

В этом примере функциональный printSucess называется после красной ошибки Division by Zero. Поэтому существует серый Function not reachable, проверяют определение printSuccess.

#include<stdio.h>
#define MAX 1000
#define MIN 0

int getNum(void);

void checkUpperBound(double ratio) 
{
    if(ratio < MAX)
        printf("The ratio is within bounds.");
}

void checkLowerBound(double ratio) 
{
    if(ratio > MIN)
        printf("The ratio is within bounds.");
}

void checkRatio(double ratio) 
{
    checkUpperBound(ratio);
    checkLowerBound(ratio);
}

void main() {
    int num=getNum(), den=0;
    double ratio;
    ratio=num/den;
    checkRatio(ratio);
}

В этом примере функциональный checkRatio следует за красной ошибкой Division by Zero. Поэтому существует серая ошибка Function not reachable на определении checkRatio. Поскольку checkUpperBound и checkLowerBound называются только от checkRatio, существует также серый Function not reachable, проверяют их определения.

#include<stdio.h>

int getNum(void);
int getChoice(void);

int num, den, choice;
double ratio;

void display(void) 
{
    printf("Numerator = %d, Denominator = %d", num, den);
}

void display2(void) 
{
    printf("Ratio = %.2f",ratio);
}


void main() {
    void (*fptr)(void);

    choice = getChoice();
    if(choice == 0)
        fptr = &display;
    else
        fptr = &display2;

    num = getNum();
    den = 0;
    ratio = num/den;

    (*fptr)();
}

В этом примере, в зависимости от значения choice указатель функции fptr может указать или на display или на display2. Вызов через fptr следует за красной ошибкой Division by Zero. Поскольку display и display2 называются только через fptr, серая проверка Function not reachable появляется на их определениях.

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

Группа: Поток данных
Язык: C | C++
Акроним: FNR