メインコンテンツ

初期化されていない戻り値

値を戻すはずの C 関数が値を戻さない

説明

このチェックは、void 以外の戻り値の型をもつ関数が値を返すかどうかを判別します。このチェックは各関数呼び出しに表示されます。

すべて展開する

#include <stdio.h>
int input(void);
int inputRep(void);

int reply(int msg) {
  int rep = inputRep();
  if (msg > 0) return rep;
}

void main(void) {
  int ch = input(), ans;
  if (ch <= 0)
    ans = reply(0);
  else
    ans = reply(ch);
  printf("The answer is %d.",ans);
}

この例では、関数呼び出し reply(0) に対して戻り値がありません。したがって、[初期化されていない戻り値] チェックはレッド エラーを返します。2 番目の呼び出し reply(ch) は常に値を返します。したがって、この呼び出しでのチェックはグリーンになります。

修正 — すべての入力に対し値を返す

1 つの修正方法として、reply() へのすべての入力に対し値を返すとします。

#include <stdio.h>
int input();
int inputRep();

int reply(int msg) {
  int rep = inputRep();
  if (msg > 0) return rep;
  return 0;
}

void main(void) {
  int ch = input(), ans;
  if (ch <= 0)
    ans = reply(0);
  else
    ans = reply(ch);
  printf("The answer is %d.",ans);
}
#include <stdio.h>
int input();
int inputRep(int);

int reply(int msg) {
  int rep = inputRep(msg);
  if (msg > 0) return rep;
}

void main(void) {
  int ch = input(), ans;
  if (ch < 10)
    ans = reply(ch); 
  else
    ans = reply(10);
  printf("The answer is %d.",ans);
}

この例では、if ステートメントの最初の分岐において、ch の値を次の 2 つの範囲に分割できます。

  • ch < = 0:関数呼び出し reply(ch) に対して、戻り値はありません。

  • ch > 0 および ch < 10: 関数呼び出し reply(ch) に対して、戻り値があります。

したがって、[初期化されていない戻り値] チェックは reply(ch) に対しオレンジ エラーを返します。

修正 — すべての入力に対し値を返す

1 つの修正方法として、reply() へのすべての入力に対し値を返すとします。

#include <stdio.h>
int input();
int inputRep(int);

int reply(int msg) {
  int rep = inputRep(msg);
  if (msg > 0) return rep;
  return 0;
}

void main(void) {
  int ch = input(), ans;
  if (ch < 10)
    ans = reply(ch); 
  else
    ans = reply(10);
  printf("The answer is %d.",ans);
}

チェック情報

グループ: データ フロー
言語: C
頭字語: IRV