メインコンテンツ

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

CERT C++: MSC37-C

Ensure that control never reaches the end of a non-void function

説明

ルール定義

制御が非 void 関数の最後に達しないようにします。1

Polyspace 実装

ルール チェッカーは、"return ステートメントがありません" をチェックします。

すべて展開する

問題

return ステートメントがありませんは、関数が少なくとも 1 つの実行パスで値を返さない場合に発生します。関数の戻り値の型が void の場合、このエラーは起こりません。

リスク

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

修正方法

ほとんどの場合、return ステートメントを関数本体の最後に配置することで、この欠陥を修正できます。

または、関数本体のどの実行パスに return ステートメントがないかを特定して、該当するパスに return ステートメントを追加することができます。多くの場合、結果の詳細にはこの実行パスを示す一連のイベントが表示されます。パス内の適切なポイントに return ステートメントを追加できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して逆のトレースを行い、これまでの関連するイベントを確認できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈も参照してください。

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

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

例 - return ステートメントが無いまたは無効であるエラー
int AddSquares(int n)
 {
   int i=0;
   int sum=0;
   
   if(n!=0) 
    {
     for(i=1;i<=n;i++)
        {
         sum+=i^2;
        }
     return(sum);
    }
 }  //Noncompliant
/* 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;  
  }

チェック情報

グループ: 49.その他 (MSC)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.