メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C: Rec.PRE01-C

マクロ内ではパラメーター名を囲むかっこを使用する

説明

ルール定義

マクロ内ではパラメーター名を囲むかっこを使用します。1

Polyspace 実装

ルール チェッカーは、"マクロ パラメーターがかっこで囲まれていない" をチェックします。

すべて展開する

問題

この問題は、マクロ パラメーターに式が含まれているが、マクロ定義またはマクロ使用内でそのパラメーターがかっこで囲まれていない場合に発生します。

マクロ パラメーターに式が含まれていない場合は、かっこは必要ありません。

リスク

式を含むマクロ パラメーターをかっこで囲まなかった場合は、パラメーターが置き換えられたときに、必要な結果に演算子の優先順位が付与されない可能性があります。

修正方法

マクロ パラメーターに式が含まれている場合は、マクロ定義またはマクロ使用でパラメーターをかっこで囲みます。

例 - マクロ式
#define mac1(x, y) (x * y)
#define mac2(x, y) ((x) * (y))

void foo(void){
    int r;

    r = mac1(1 + 2, 3 + 4);       /* Non-compliant */
    r = mac1((1 + 2), (3 + 4));   /* Compliant */

    r = mac2(1 + 2, 3 + 4);       /* Compliant */
}

この例で、mac1mac2 は同じ定義を実装していると考えられるマクロです。

  • mac1 の定義では、マクロ パラメーターがかっこで囲まれていません。非準拠の式では、マクロが r = (1 + 2 * 3 + 4); に展開されます。意図された式は (1 + (2 * 3) + 4) または (1 + 2) * (3 + 4) の可能性があります。ただし、かっこがないため、開発者またはコード レビュー担当者は、式の意図を判断できない可能性があります。以降の準拠式では、マクロ パラメーターがかっこで囲まれているため、意図されたマクロ式は明らかに (1 + 2) * (3 + 4) です。

  • mac2 の定義では、パラメーターがかっこで囲まれています。mac2 を含む式は、(1 + 2) * (3 + 4) に展開され、ルールに準拠しています。

チェック情報

グループ: Rec.01.プリプロセッサ (PRE)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.