C and C++


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

要旨

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

プロパティ

クラス名 Side Effects in C Generic Selection
日本語クラス名 Side Effects in C Generic Selection
クラス分類 スタイル (style)
ニーモニック LANG.STRUCT.SE.CGEN
カテゴリー
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
対応言語 C のみ利用可能です。 C++ は利用できません。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Side Effects in C Generic Selection"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

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

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

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