メインコンテンツ

セミコロンで終了するマクロ

マクロ定義がセミコロンで終了している

説明

この欠陥は、1 回以上呼び出されたマクロにセミコロンで終了する定義が含まれている場合に発生します。

リスク

マクロ定義がセミコロンで終了している場合は、マクロ展開が式の内部などの特定のコンテキストでの意図しないプログラム ロジックにつながる可能性があります。

たとえば、次のマクロを考えてみましょう。

#define INC_BY_ONE(x) ++x;
次の式で使用された場合は、
res = INC_BY_ONE(x)%2;
式が次のように解決されます。
res = ++x; %2;
x+1 の値が res に代入されますが、これは意図されていない可能性があります。残りのスタンドアロン ステートメント %2; は有効な C コードであり、厳密なコンパイラ警告を有効にしない限り検出されません。

修正方法

マクロ定義をセミコロンで終了しないようにします。マクロの後ろにセミコロンを付けるかどうかはユーザーに任せてください。

または、セミコロンで終わるステートメントを含む関数形式マクロより、インライン関数を使用します。

すべて展開する

#define WHILE_LOOP(n) while(n>0);

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

この例では、マクロ WHILE_LOOP(n) の定義がセミコロンで終わっているため、不具合が発生します。このセミコロンがあるため、while ループの本体が空になり、ブロック内の後続のステートメントが 1 回しか実行されません。ループは 100 回繰り返されるように想定されていました。

修正 – マクロ定義からセミコロンを削除する

マクロ定義から末尾のセミコロンを削除します。マクロのユーザーは、必要に応じてマクロの後ろにセミコロンを追加できます。この例では、セミコロンは必要ありません。

#define WHILE_LOOP(n) while(n>0)

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: SEMICOLON_TERMINATED_MACRO
影響度: Low

バージョン履歴

R2020a で導入