メインコンテンツ

MISRA C:2012 Rule 20.9

All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define’d before evaluation

説明

ルール定義

All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define’d before evaluation 1 .

根拠

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

レポート内の追加のメッセージ

Identifier is not defined.

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#if M == 0                   /* Non-compliant - Not defined */
#endif

#if defined (M)              /* Compliant - M is not evaluate */
#if M == 0                   /* Compliant - M is known to be defined */
#endif
#endif

#if defined (M) && (M == 0)  /* Compliant
                              * if M defined, M evaluated in ( M == 0 ) */
#endif

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

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

この例ではプリプロセッサ命令での M のさまざまな使用方法を示しています。2 番目と 3 番目の #if 句はソフトウェアが M を評価する前に M を定義しているかどうかチェックしています。最初の #if 句は M が定義されているかどうかチェックしていません。また、M が定義されていないため、ステートメントは準拠していません。

最後の #if 句では、マクロ ADD が定義済みのトークン XXYY に解決されます。Polyspace® は違反を報告しません。

チェック情報

グループ: プリプロセッサ命令
カテゴリ: 必要
AGC カテゴリ: 必要

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.