C++ で非ボイド関数エラーの終了に達する制御を解決する

胡金庫 2023年10月12日
  1. 関数本体の最後に return 文を使用する
  2. 関数本体の各コードパスの最後に return 文を使用してください
C++ で非ボイド関数エラーの終了に達する制御を解決する

この記事では、制御が非ボイド関数の終了に達するエラーを解決するためのいくつかの方法を説明します。

関数本体の最後に return 文を使用する

非ボイド関数は、戻り値の型を持つことが要求されます。その結果、関数は対応する型のオブジェクトを返す文を持つ必要があります。特定のコンパイラフラグが渡されると、このタイプのエラーや警告が完全に抑制されてしまい、プログラム内で指定された関数が呼び出された場合に実行時エラーが発生する可能性があります。

以下のコード例では、reverseString 関数が定義されており、これは文字列への参照を受け取り文字列の値を返します。関数本体を見てみると、return 文はありません。reverseString は呼び出し元の関数に引数を渡さないにもかかわらず、コンパイラは警告メッセージを表示するだけで、実行プログラムはとにかくビルドされます。関数が呼び出された場合、制御フローがセグメンテーションフォールトを起こす可能性が高いです。

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

string reverseString(string &s) { string rev(s.rbegin(), s.rend()); }

int main() {
  string str = "This string is arbitrary";
  int cond = -1;

  cout << str << endl;
  cout << reverseString(str, cond) << endl;

  return EXIT_SUCCESS;
}

関数本体の各コードパスの最後に return 文を使用してください

制御が非ボイド関数の最後に到達するもう一つのシナリオは、条件ブロックがすべてのパスに return 文を持たない場合です。したがって、非ボイド関数の実行が分岐していて if 文がすべての可能なパスをカバーしていない場合、関数本体の最後に明示的な return 呼び出しが必要になります。

次の例では、戻り値を呼び出し元の関数に渡す 2つの条件付きパスを持つ文字列操作関数を示します。しかし、与えられた条件が評価されないままになっているケースもあります。これは、制御フローが関数ブロックの最後まで到達し、ランタイムエラーが発生する可能性があることを意味します。

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

string reverseString(string &s, int condition) {
  if (condition == -1) {
    string rev(s.rbegin(), s.rend());
    return s;
  } else if (condition == 0) {
    return s;
  }
}

int main() {
  string str = "This string is arbitrary";
  int cond = -1;

  cout << str << endl;
  cout << reverseString(str, cond) << endl;

  return EXIT_SUCCESS;
}

以下の警告が表示される可能性があります。

Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Function