主要内容

不可达函数

从代码的不可达部分调用了函数

描述

此检查出现在函数定义处。如果函数仅从代码的不可达部分被调用,则该检查会呈灰显状态。不可达代码可能以下列方式之一出现:

  • 通过始终是 false 的条件访问了代码。

  • 跟在 breakreturn 语句后的代码。

  • 代码位于红色检查之后。

如果您的代码未包含 main 函数,则此检查会被禁用

注意

默认情况下不启用此检查。要启用此检查,您必须指定相应的分析选项。有关详细信息,请参阅检测未调用的函数 (-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();
  }
}

在此示例中,在 main 的第二个 for 循环中,i 始终小于 SIZE。因此,条件 if(i<SIZE)else 分支永远不可达。由于函数 printError 仅在 else 分支中被调用,因此 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();
}

在此示例中,函数 printSuccess 在红色的除以零错误后被调用。因此,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 跟在一个红色的除以零错误之后。因此,checkRatio 的定义上会显示一个灰色的不可达函数错误。由于仅从 checkRatio 调用 checkUpperBoundcheckLowerBound,因此它们的定义上也会出现灰色的不可达函数检查。

#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 可以指向 displaydisplay2。通过 fptr 进行的调用跟在一个红色的除以零错误之后。由于 displaydisplay2 仅通过 fptr 被调用,因此它们的定义上也会出现灰色的不可达函数检查。

检查信息

组:数据流
语言:C | C++
缩写:FNR