メインコンテンツ

MISRA C:2023 Rule 23.1

A generic selection should only be expanded from a macro

R2024a 以降

説明

ルール定義

A generic selection should only be expanded from a macro 1 .

根拠

総称選択では、引数の型をクエリして、型に合わせて異なるアクションを選択できます。引数の型に応じたアクションを選択することで、コードに汎用関数を取り入れることができます。総称選択をコードで直接使用する場合は、そのオペランドの型は既知であるため、総称選択の有用性は失われます。

関数形式のマクロで総称選択を導入し、その引数の型に応じて選択を実行するのが最も効果的です。

Polyspace 実装

ルール チェッカーは、以下の条件のいずれかが満たされた場合に違反を報告します。

  • 総称選択がマクロから展開されない。

  • 総称選択のセレクターが、展開されたマクロの引数ではない。

トラブルシューティング

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

すべて展開する

この例では、総称選択ステートメント _Generic(x, int:1, float:2) がマクロから展開されず、直接使用されています。この総称選択を作成する時点で、x の型は既知です。この総称選択は有用ではありません。ルール チェッカーは違反を報告します。


int x = 0;
void f() {
    
    int y = _Generic( x    /*Noncompliant*/
                , int : 1
                , float : 2 );
}


extern void handle_int(int x);
extern void handle_float(float x);
extern void handle_any(char x);
#define arith(X) ( _Generic( (X) /* Compliant*/\
                    , int : handle_int \
                    , float : handle_float \
                    , default : handle_any \
                    ) (X) )
/* Non-compliant */
#define maybe_inc(Y) ( _Generic( x /* Noncompliant*/\
                    , int : 1 \
                    , default : 0 ) + (Y) )

void foo() {
    unsigned char c = 0;
    arith(c);         
    maybe_inc(c);
}

総称選択マクロ maybe_inc では、型の選択は x (maybe_inc の引数ではない) の型に応じて異なります。ルール チェッカーは違反を報告します。

チェック情報

グループ: 総称選択
カテゴリ: 推奨
AGC カテゴリ: 推奨

バージョン履歴

R2024a で導入


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.