メインコンテンツ

MISRA C:2012 Rule 15.5

A function should have a single point of exit at the end

説明

ルール定義

A function should have a single point of exit at the end 1 .

根拠

このルールでは return ステートメントが関数本体の最後のステートメントとして記述されなければなりません。それ以外の場合は、以下の問題が発生する可能性があります。

  • return ステートメントに後に続くコードが意図せずに省略される可能性がある。

  • 一部の引数を変更する関数に早期の return ステートメントがある場合、コードを解読する際にどの変更が実際に発生するのかすぐには分かりにくい。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#define MAX ((unsigned int)2147483647)
#define NULL (void*)0

typedef unsigned int bool_t;
bool_t false = 0;
bool_t true = 1;

bool_t f1(unsigned short n, char *p) {          /* Non-compliant */
    if(n > MAX) {
        return false;
    }

    if(p == NULL) {
        return false;
    }

    return true;
}

この例では、3 つの return ステートメントがあるため、ルールに違反します。

修正 — 変数を使用して戻り値を格納

1 つの修正方法として、戻り値を変数に格納し、この変数を関数が終了する直前に返します。

#define MAX ((unsigned int)2147483647)
#define NULL (void*)0

typedef unsigned int bool_t;
bool_t false = 0;
bool_t true = 1;
bool_t return_value;

bool_t f2 (unsigned short n, char *p) {         /* Compliant */
    return_value = true;
    if(n > MAX) {
        return_value = false;
    }

    if(p == NULL) {
        return_value = false;
    }

    return return_value;
}

チェック情報

グループ: 制御フロー
カテゴリ: 推奨
AGC カテゴリ: 推奨

バージョン履歴

R2014b で導入

すべて展開する


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.