メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

return ステートメントがありません

void 以外の戻り値の型を含む関数が一部のパスで値を返さない

説明

この欠陥は、関数が少なくとも 1 つの実行パスで値を返さない場合に発生します。この欠陥が発生しない場合:

  • 関数の戻り値の型が void の場合。

  • 実行パスが [[noreturn]] 関数などの実行の流れを戻さない関数によって終了される場合。

  • C99 以上の C バージョンまたは C++ を使用している場合。C99 以上の C バージョンと C++ では、main 関数は、戻り値が指定されていない場合には 0 を暗黙的に返します。

リスク

関数のシグネチャに void でない戻り値がある場合、値を返すことを想定しています。この関数の戻り値は以降の計算で使用される可能性があります。関数本体の実行が return ステートメントのないパスを通過する場合、関数の戻り値は不確定になります。この戻り値を使用する計算は、予期しない結果につながる場合があります。

修正方法

ほとんどの場合、return ステートメントを関数本体の最後に配置することで、この欠陥を修正できます。コードに実行の流れを戻さない実行パスが含まれている場合は、属性 [[noreturn]] を使用してそれらを指定します。

または、関数本体のどの実行パスに return ステートメントがないかを特定して、該当するパスに return ステートメントを追加することができます。多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

解析により、プロセス終了関数が存在するパス上で return ステートメントの欠落にフラグを設定する場合は、オプション -termination-functions を使用して、プロセス終了関数が解析で認識されるようにできます。

すべて展開する

int AddSquares(int n)
 {
   int i=0;
   int sum=0;
   
   if(n!=0) 
    {
     for(i=1;i<=n;i++)
        {
         sum+=i^2;
        }
     return(sum);
    }
 } 
/* Defect: No return value if n is not 0*/

n が 0 に等しい場合、このコードは if ステートメントに入りません。したがって、関数 AddSquaresn が 0 の場合には値を返しません。

修正 — すべての実行パスに return ステートメントを記述

1 つの修正方法として、if...else ステートメントのすべての分岐で値を返すことができます。

 int AddSquares(int n)
 {
   int i=0;
   int sum=0;
   
   if(n!=0) 
    {
     for(i=1;i<=n;i++)
        {
         sum+=i^2;
        }
     return(sum);
    } 
   
   /*Fix: Place a return statement on branches of if-else */
   else 
     return 0;  
  }

結果情報

グループ: データ フロー
言語: C | C++
既定値: オン
コマンド ライン構文: MISSING_RETURN
影響度:Low

バージョン履歴

R2013b で導入

すべて展開する