メインコンテンツ

AUTOSAR C++14 Rule M6-4-5

An unconditional throw or break statement shall terminate every non-empty switch-clause

説明

ルール定義

無条件の throw または break ステートメントは、空でないすべての switch 句を終了させるものとします。

根拠

switch 句の終わりで throw または break ステートメントが使用されていない場合、制御フローは次の switch 句にフォール スルーします。この動作が意図されていない場合、予期しない結果になる可能性があります。意図されていないフォール スルー動作を防ぐには、throw または break ステートメントの使用が役立ちます。case 句と default 句のそれぞれで、最後のステートメントとして throw または break ステートメントを使用してください。

まったく同じステートメントが不要になるよう、フォール スルーを使用して複数の句をグループ化する場合は、空の case ラベルの使用が許容されます。

Polyspace 実装

Polyspace® は、case ラベルにステートメントが含まれていて、throw または break ステートメントが case ラベルの最後のステートメントになっていない場合は常に、この欠陥を報告します。

トラブルシューティング

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

すべて展開する

#include <cstdint>

int x, y = 2;

int example(int x)	 
{
    switch (x) {         //noncompliant error shows here
    case 0:              //compliant empty fall through
    case 1:
        break;           //compliant break
    case 2:
        x = y ^ 2;       //error: unintentional fall through
    case 3:              //compliant throw
        throw;

    default:             //compliant break
        break;
    }

    return x;
}

case 2 に throw または break ステートメントが含まれていないため、このラベルは case 3 にフォール スルーします。このようなフォール スルーは非準拠です。

Case 0 は空の case ラベルであるため、case 1 にフォール スルーします。これはルールに準拠する、空の case ラベルのフォール スルーです。

チェック情報

グループ: ステートメント
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入