メインコンテンツ

MISRA C++:2008 Rule 16-1-1

The defined preprocessor operator shall only be used in one of the two standard forms.

説明

ルール定義

The defined preprocessor operator shall only be used in one of the two standard forms. 1

根拠

defined プリプロセッサ演算子は、識別子がマクロとして定義されているかどうかを確認します。C で許容されるこの演算子の 2 つの形式を次に示します。

  • defined (identifier)

  • defined identifier

上記以外の形式を使用すると、コンパイラが報告しない、無効なコードが生成される可能性があります。たとえば defined 演算子の引数として式を使用する場合、コードは無効です。defined の無効な使用がコンパイラによって報告されない場合、無効なコードの診断が難しくなります。

#if などのプリプロセッサ命令が展開され、defined ステートメントが作成される場合、コードの動作は未定義です。次に例を示します。

#define DEFINED defined
#if DEFINED(X)
#if プリプロセッサ命令が展開され、defined 演算が作成されます。ご使用の環境によっては、コードが予期しない方法で動作し、診断が難しいバグにつながる可能性があります。

無効なコード、バグ、未定義の動作を回避するには、defined 演算子を使用するときに、許可されている形式のみを使用するようにします。

Polyspace 実装

Polyspace® は、次のような defined 演算子の誤った使用にフラグを設定します。

  • defined 演算子が識別子なしで使用されている。

  • defined 演算子がマクロ展開後に位置している。

  • defined 演算子が複合式で使用されている。

トラブルシューティング

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

すべて展開する

#if defined (X<Y)//Noncompliant
//...
#endif
#if defined (X) && defined (Y) &&(X<Y)//Compliant
//...
#endif

この例では、識別子 X と Y が定義されており、かつ X が Y よりも小さい場合にのみ、コード ブロックが条件に基づいて実行されます。defined 演算子の引数として式を使用してこの条件を作成する操作は許容されず、そのような操作は無効なコードが発生する原因となります。Polyspace は、許容されない defined ステートメントにフラグを設定します。このような条件を定義するために許容されている方法として、個々の識別子に defined を使用します。

チェック情報

グループ: 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.