メインコンテンツ

到達不能の関数

関数がコードの到達不能箇所から呼び出されています。

説明

このチェックは関数定義に表示されます。関数の呼び出し元がコードの到達不能箇所のみの場合、チェックはグレーで表示されます。到達不能コードは以下のいずれかの方法で示されます。

  • 常に false となる条件を介してコードに到達する。

  • コードの前に break または return ステートメントがある。

  • コードの前にレッド チェックがある。

コードが 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の 2 番目の for ループで、i は常に SIZE より小さくなります。したがって、条件 if(i<SIZE)else 分岐には決して到達しません。関数 printErrorelse 分岐からのみ呼び出されるため、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 の定義にグレーの[到達不能の関数] エラーが現れています。checkUpperBound および checkLowerBound の呼び出し元が checkRatio のみであるため、それらの定義にもグレーの [到達不能の関数] チェックが現れています。

#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 の値に応じて関数ポインター fptrdisplay または display2 を指す可能性があります。fptr を介した呼び出しは、[ゼロ除算] のレッド エラーの後にあります。display および display2fptr を介してのみ呼び出されるため、それらの定義にグレーの [到達不能の関数] チェックが表示されます。

チェック情報

グループ: データ フロー
言語: C | C++
頭字語: FNR