This diagnostic rule is based on the MISRA (Motor Industry Software Reliability Association) software development guidelines.
This diagnostic rule is relevant only for C.
The _Generic
construct (C11) used with certain types from the association list can lead to unexpected results.
Before a controlling expression is matched to the association list, it undergoes a chain of implicit conversions (lvalue conversion):
const
/ volatile
/ restrict
top-level qualifiers are discarded;The C standard does not impose any restrictions on the types specified in the association list, therefore a certain branch may never be selected. So, the association list must not contain any of the following types:
const
/ volatile
/ restrict
qualified type;default
association).The example:
#define builtin_typename(expr) \ (_Generic( (expr) \ , char: "char" \ , const char: "const char" \ , volatile char: "volatile char" \ , const volatile char: "const volatile char" \ , short: "short" \ , const short: "const short" \ , volatile short: "volatile short" \ , const volatile short: "const volatile short" \ , ....) )
In the code, the builtin_typename
macro is declared, converting the passed expression to a string literal that contains the expression type. To do this, all built-in types with combinations of const
and volatile
qualifiers are enumerated. However, the controlling expression will never be cv
-qualified after implicit conversions. As a result, such a _Generic
construct includes associations that will never be selected.
The fixed code:
#define builtin_typename(expr) \ (_Generic( (expr) \ , char: "char" \ , short: "short" \ , ....) )
This diagnostic is classified as:
|