マクロ引数のプリプロセッサ命令
関数形式のマクロの引数で使用されるプリプロセッサ命令
説明
この欠陥は、関数形式のマクロまたは関数形式のマクロとして実装される可能性がある関数の引数でプリプロセッサ命令を使用した場合に発生します。
たとえば、関数 memcpy
の引数において #ifdef
ステートメントが発生するとします。関数 memcpy
はマクロとして実装される場合があります。
memcpy(dest, src, #ifdef PLATFORM1 12 #else 24 #endif );
printf
および assert
における同様の使用にフラグを設定します。リスク
前処理中、関数形式のマクロ呼び出しはマクロ本体に置き換えられ、そのパラメーターはマクロ呼び出しの引数に置き換えられます (引数の置換)。マクロ min()
が次のように定義されているとします。
#define min(X, Y) ((X) < (Y) ? (X) : (Y))
min(1,2)
を呼び出すと、その本体 ((X) < (Y) ? (X) : (Y))
に置き換えられます。X
と Y
は 1 と 2 に置き換えられます。C11 規格 (節 6.10.3) によると、関数形式のマクロ自体の引数のリストにプリプロセッサ命令がある場合、前処理中における引数の置換は未定義になります。
修正方法
引数の置換が明確な方法で発生するように、関数形式のマクロの外でプリプロセッサ命令を使用します。
たとえば、#ifdef
命令に基づくさまざまな引数を使用して memcpy
を実行するには、#ifdef
命令分岐内で memcpy
を複数回呼び出します。
#ifdef PLATFORM1 memcpy(dest, src, 12); #else memcpy(dest, src, 24); #endif
例
結果情報
グループ: プログラミング |
言語: C | C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: PRE_DIRECTIVE_MACRO_ARG |
影響度: Low |
バージョン履歴
R2018a で導入