C and C++


LANG.STRUCT.CGEN.IMPE : Inconsistent Macro Parameter Expansion in C Generic

Summary

A C generic selection expression for which both of the following are true.

Properties

Class Name Inconsistent Macro Parameter Expansion in C Generic
Significance style
Mnemonic LANG.STRUCT.CGEN.IMPE
Categories
MisraC2023 MisraC2023:23.7 A generic selection that is expanded from a macro should evaluate its argument only once
Misra2012 Misra2012:23.7 A generic selection that is expanded from a macro should evaluate its argument only once
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="Inconsistent Macro Parameter Expansion 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

/* 'Inconsistent Macro Parameter Expansion in C Generic' warning issued on following line */
#define IMPE_1(x) (_Generic(x, \
                            float32_t:x, /* x evaluated once */ \
                            default:0))  /* x evaluated zero times */

/* 'Inconsistent Macro Parameter Evaluation in C Generic' warning issued on following line
 * ('Excessive Macro Parameter Evaluation in C Generic' warning also issued when enabled)
 */
#define IMPE_2(x) (_Generic(x, \
                            int:x+x,     /* x evaluated twice */ \
                            default:x))  /* x evaluated once */

#define IMPE_OK1(x) (_Generic(x, int:x, default:x+2))     /* ok: x always evaluated once */
#define IMPE_OK2(x) (_Generic(x, int:1, default:0))       /* ok: x always evaluated zero times */
#define IMPE_OK3(x) (_Generic(x, int:x+x, default:x+x+2)) /* ok: x always evaluated twice
                                                           * ('Excessive Macro Parameter Evaluation in C Generic'
                                                           *   warning issued when enabled)
                                                           */

Relevant Configuration File Parameters

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