C and C++


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

Summary

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.

Properties

Class Name Inappropriate Selection Type in C Generic
Significance style
Mnemonic LANG.TYPE.CGEN.IST
Categories
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
Availability Available for C only (not C++).
Enabling Checks for this warning class are disabled by default, and require the unnormalized C ASTs for the project. To enable them, add the following WARNING_FILTER rule and RETAIN_UNNORMALIZED_C_AST specification to the project configuration file.
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Inappropriate Selection Type in C Generic"
Note that retaining the unnormalized ASTs will increase the disk space used to store the project representation, and may make the analysis take longer.

Example

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;
}

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.