C and C++


LANG.PREPROC.MARGME : Macro Argument is both Mixed and Expanded

要旨

A macro argument is subject to preprocessor expansion, and the corresponding macro parameter is "mixed use": it is used both in the body of the macro and separately as an operand to the # or ## operator.

See also:

プロパティ

クラス名 Macro Argument is both Mixed and Expanded
日本語クラス名 Macro Argument is both Mixed and Expanded
クラス分類 スタイル (style)
ニーモニック LANG.PREPROC.MARGME
カテゴリー
MisraC2023 MisraC2023:20.10 The # and ## preprocessor operators should not be used
  MisraC2023:20.12 A macro parameter used as an operand to the # or ## operators, which is itself subject to further macro replacement, shall only be used as an operand to these operators
Misra2012 Misra2012:20.10 The # and ## preprocessor operators should not be used
  Misra2012:20.12 A macro parameter used as an operand to the # or ## operators, which is itself subject to further macro replacement, shall only be used as an operand to these operators
Misra2004 Misra2004:19.13 The # and ## preprocessor operators should not be used
AUTOSARC++14 AUTOSARC++14:A16-0-1 The pre-processor shall only be used for unconditional and conditional file inclusion and include guards, and using the following directives: (1) #ifndef, (2) #ifdef, (3) #if, (4) #if defined, (5) #elif, (6) #else, (7) #define, (8) #endif, (9) #include.
  AUTOSARC++14:M16-3-2 The # and ## operators should not be used.
MisraC++2008 MisraC++2008:16-3-2 The # and ## operators should not be used.
MisraC++2023 MisraC++2023:19.3.1 The # and ## preprocessor operators should not be used
  MisraC++2023:19.3.3 The argument to a mixed-use macro parameter shall not be subject to further expansion
CWE CWE:710 Improper Adherence to Coding Standards
CERT-C CERT-C:PRE05-C Understand macro replacement when concatenating tokens or performing stringification
POW10 POW10:8 Limit the use of the preprocessor to file inclusion and simple macros.
JPL JPL:20 Make only very limited use of the C pre-processor.
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Macro Argument is both Mixed and Expanded"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

extern int dbg(int, char *);
#define STRINGY(X) (dbg(X, #X))         /* parameter X is mixed use */
                                        /* (will trigger 'Function-Like Macro', 'Macro Uses # Operator',
                                         *  and 'Use of #define' warnings if enabled)
                                         */
#define MULT4(X) ((X) * 4)              /* (will trigger 'Function-Like Macro' and 'Use of #define' warnings if enabled) */
#define LIMIT (1000 * 5)                /* (will trigger 'Use of #define' warning if enabled) */

void lang_preproc_margme(int param) {
    STRINGY(LIMIT);     /* 'Macro Argument is both Mixed and Expanded' warning issued here
                         * - parameter LIMIT is subject to preprocessor expansion
                         * - the corresponding STRINGIFY() parameter is "mixed use"
                         */
    STRINGY(param);                     /* ok: param is not subject to expansion */
    MULT4(LIMIT);                       /* ok: corresponding MULT4() parameter is not mixed use */
}

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

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