C and C++


LANG.STRUCT.SE.CGEN : Side Effects in C Generic Selection

Summary

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

Properties

Class Name Side Effects in C Generic Selection
Significance style
Mnemonic LANG.STRUCT.SE.CGEN
Categories
MisraC2023 MisraC2023:23.1 A generic selection should only be expanded from a macro
  MisraC2023:23.2 A generic selection that is not expanded from a macro shall not contain potential side effects in the controlling expression
Misra2012 Misra2012:23.1 A generic selection should only be expanded from a macro
  Misra2012:23.2 A generic selection that is not expanded from a macro shall not contain potential side effects in the controlling expression
CERT-C CERT-C:EXP44-C Do not rely on side effects in operands to sizeof, _Alignof, or _Generic
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="Side Effects in C Generic Selection"
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

#define GENERIC_IN_MACRO(X) (_Generic(X++, \
                                      int:1, \
                                      default:0)) /* ok: controlling expression contains an apparent
                                                   * side effect, but the generic selection expression
                                                   * is inside a macro definition.
                                                   */

int lang_struct_se_cgen(int x){
  return _Generic(x++,                /* 'Side Effects in C Generic Selection' warning issued here
                                       * - controlling expression x++ contains an apparent side effect.
                                       */
                  int:1,
                  default:0);
}

int f(void) {return 5;}

int lang_struct_se_cgen_func(int x){
  return _Generic(f(),                /* 'Side Effects in C Generic Selection' warning issued here
                                       * - function calls are always treated as containing
                                       *   an apparent side effect.
                                       */
                  int:1,
                  default:0);
}

int lang_struct_se_cgen_ok(int x){
  return _Generic(x, int:1, default:0);           /* ok: no apparent side effect in controlling expression x */
}

int lang_struct_se_cgen_ok_macro(int x){
  return GENERIC_IN_MACRO(x);
}

Relevant Configuration File Parameters

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