AUTOSAR C++14 Rule M16-0-6
In the definition of a function-like macro each instance of a parameter shall be enclosed in parentheses unless it is used as the operand of # or ##.
説明
ルール定義
In the definition of a function-like macro each instance of a parameter shall be enclosed in parentheses unless it is used as the operand of # or ##.
根拠
関数形式のマクロを呼び出すと、コンパイラがマクロのパラメーターをトークンで置き換えて、マクロを展開します。コンパイラは、この展開したマクロをコードに代入します。この展開と代入のプロセスでは、演算の優先順位は考慮されません。関数形式のマクロは、そのパラメーターが小かっこで囲まれていない場合、予期せぬ結果をもたらす可能性があります。たとえば、次の関数形式のマクロがあるとします。
#define dustance_from_ten(x) x>10? x-10:10-x
a-b>10: a-b-10:10-a-b
10-a-b は、意図された距離 10-(a-b) ではなく 10-(a+b) と等価になります。この予期せぬ動作はエラーやバグの原因になる可能性があります。このような予期せぬ動作を回避するには、関数形式のマクロのパラメーターを小かっこで囲みます。パラメーターが # または ## のオペランドとして使用されている場合は、このルールの例外となります。
Polyspace 実装
関数形式のマクロのパラメーターが小かっこで囲まれていない場合、Polyspace® はこのマクロ定義にフラグを設定します。パラメーターの前に演算子 .、->、または文字 #、## がある場合、Polyspace は小かっこで囲まれていないパラメーターにフラグを設定しません。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: プリプロセッサ命令 |
| カテゴリ: Required、Automated |
バージョン履歴
R2019a で導入