メインコンテンツ

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

MISRA C++:2023 Rule 0.0.1

A function shall not contain unreachable statements

R2024b 以降

説明

ルール定義

A function shall not contain unreachable statements. 1

根拠

関数のエントリ ポイントから到達できないステートメントは、多くの場合、プログラム ロジックにエラーがあることを示しています。プログラムで未定義の動作が使用されていない限り、到達不能なブロックは実行不可能であり、プログラムの出力に一切の影響を与えません。

Polyspace 実装

ルール チェッカーは、次の場合に違反を報告します。

  • 次のいずれかのステートメントを使用した制御フロー内の break が原因で、コードのセクションに到達できなかった場合。

    • break および return

    • goto

    • while(1) などのトリビアルな無限ループ

  • スローされた例外を先行する catch ステートメントが処理したために、catch ステートメントに到達しない場合。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

typedef enum _suit {UNKNOWN_SUIT, SPADES, HEARTS, DIAMONDS, CLUBS} suit;
suit nextcard(void);
void guess(suit s);

suit deal (void){
    suit card = nextcard();
    if( (card < SPADES) || (card > CLUBS) ) 
        card = UNKNOWN_SUIT;
        return card;

    if (card < HEARTS) {   // Noncompliant - code follows return
        guess(card);
    }
    return card;
}

suit deal_fixed (void){
    suit card = nextcard();
    if( (card < SPADES) || (card > CLUBS) )  {
        card = UNKNOWN_SUIT;
        return card;
    }
    if (card < HEARTS) {   // Compliant
        guess(card);
    }
    return card;
}

この例では、1 番目の if ブロックに中かっこが欠落しているため、関数 deal() に欠陥があります。中かっこが欠落しているために、1 番目の return ステートメントは "常に"、その関数が呼び出された箇所にコードのフローを戻します。その後に続く if ブロックと 2 番目の return ステートメントは、どのコンテキストでも実行できません。

この問題は、関数 deal_fixed() で修正されます。この関数は、1 番目の if ブロックを中かっこで適切に囲んで、このブロック内の return ステートメントに続く到達不能コードを静的に回避します。

#include <new>

extern void print_str(const char* p);
extern void throw_exception();

void func() {
    try {
        throw_exception();
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }

    catch(std::bad_alloc& exc) {  //Noncompliant
        print_str(exc.what());
    }
}

void func_fixed() {
    try {
        throw_exception();
    }
    
    catch(std::bad_alloc& exc) {  // Compliant
        print_str(exc.what());
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }
}

この例では、関数 func() に含まれる 2 番目の catch ステートメントが std::bad_alloc オブジェクトを受け取ります。std::bad_alloc クラスは std::exception クラスから派生しているため、2 番目の catch ステートメントは、先行する、std::exception オブジェクトを受け取る catch ステートメントによって隠されます。

関数 func_fixed() は、catch ステートメントの順序を変更することによって、この問題を修正します。

チェック情報

グループ: 言語に依存しない問題
カテゴリ: 必要

バージョン履歴

R2024b で導入


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.