C and C++


LANG.TYPE.CGEN.IST : Inappropriate Selection Type in C Generic

要旨

A C generic selection expression has a controlling expression whose essential type that differs from its standard type (that is, its type according to the C standard).

Exception: a warning of this class is not triggered when the controlling expression is an integer constant expression that is neither a character constant nor of essentially Boolean type.

プロパティ

クラス名 Inappropriate Selection Type in C Generic
日本語クラス名 Inappropriate Selection Type in C Generic
クラス分類 スタイル (style)
ニーモニック LANG.TYPE.CGEN.IST
カテゴリー
MisraC2023 MisraC2023:23.6 The controlling expression of a generic selection shall have an essential type that matches its standard type
Misra2012 Misra2012:23.6 The controlling expression of a generic selection shall have an essential type that matches its standard type
対応言語 C のみ利用可能です。 C++ は利用できません。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Inappropriate Selection Type in C Generic"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

int lang_type_cgen_ist(int x){
    short s16 = 0;
    int rv = 0;
    rv += _Generic(s16 + s16,  /* 'Inappropriate Selection Type in C Generic' warning issued here.
                                * - Under C standard, the type of (s16+s16) is signed int.
                                * - Essential type (per MISRA C 2012) is signed short.
                                */
                   short:0,
                   default:1);
    rv += _Generic(s16,                  /* ok: standard type == essential type == signed short */
                   short:0,
                   default:1);
    rv += _Generic(20,                   /* ok: standard type != essential type (signed int vs signed short),
                                          * but integer constant is an explicit exception case.
                                          */
                   short:0,
                   default:1);
    return rv;
}

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。