メインコンテンツ

MISRA C++:2008 Rule 16-0-7

Undefined macro identifiers shall not be used in #if or #elif preprocessor directives, except as operands to the defined operator.

説明

ルール定義

Undefined macro identifiers shall not be used in #if or #elif preprocessor directives, except as operands to the defined operator. 1

根拠

プリプロセッサ命令でマクロ識別子を使用しようとすると、その識別子を定義していない場合、プリプロセッサはその値をゼロと仮定します。この値は開発者の予想と異なる可能性があります。

Polyspace 実装

Polyspace® は、#if または #elif ステートメントで未定義のマクロ識別子を使用している場合に、これらのステートメントにフラグを設定します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#if M == 0           //Noncompliant
#endif

#if defined (M)      //Complaint
#if M == 0           //Executes only when M is defined
#endif
#endif

#if defined (M) && (M == 0)  //Compliant
//...
#endif

#define XXYY 1                                          
#define ADD(a,b) a##b                                   

#if ADD(XX,YY)  // Compliant                                        
#endif

この例ではプリプロセッサ命令での M のさまざまな使用方法を示しています。

  • 1 番目の #if 句では、未定義の識別子 M が使用されています。プリプロセッサ命令の評価時に M が未定義であるため、コンパイラは M がゼロであると想定し、その結果予期せぬ結果が生じます。未定義の識別子のこのような使用は、このルールに準拠していません。Polyspace はステートメント #if にフラグを設定します。

  • 2 番目と 3 番目の #if ステートメントでは、未定義の識別子 Mdefined 演算子のオペランドとして使用されています。未定義の識別子のこのような使用は、このルールに準拠しています。

  • 最後の #if ステートメントはマクロ ADD() の結果を使用します。このマクロは定義済みのトークン XXYY に解決されます。Polyspace は違反を報告しません。

チェック情報

グループ: Preprocessing Directives
カテゴリ: 必要

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.