メインコンテンツ

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

CERT C: Rec.PRE06-C

ヘッダー ファイルをインクルード ガード内に囲む

説明

ルール定義

ヘッダー ファイルをインクルード ガード内に囲みます。1

Polyspace 実装

ルール チェッカーは、"複数回のインクルードからガードされていないヘッダー ファイルのコンテンツ" をチェックします。

すべて展開する

問題

この問題は、ヘッダー ファイルのコンテンツが複数回インクルードされるのを防ぐための安全対策が講じられていない場合に発生します。

コンテンツが複数回のインクルードからガードされていないヘッダー ファイルをインクルードする場合、解析ではこの命令への違反を報告します。違反は、ヘッダー ファイルの最初に示されます。

以下の方法のいずれかを使用して、複数回のインクルードからヘッダー ファイルのコンテンツをガードできます。


//<start-of-file>
#ifndef <control macro>
#define <control macro>
    /* Contents of file */
#endif
//<end-of-file>
または

//<start-of-file>
#ifdef <control macro> 
#error ...
#else
#define <control macro>
    /* Contents of file */
#endif
//<end-of-file>
これらの方法のいずれかを使用しない限り、Polyspace® ではヘッダー ファイルのインクルードを非準拠としてフラグを設定します。

リスク

入れ子にされたヘッダー ファイルの複雑な階層が翻訳単位に含まれる場合、特定のヘッダー ファイルが 2 回以上インクルードされ、混乱の原因になる可能性があります。複数回のインクルードにより複数の定義または定義の競合が生じる場合、プログラムで未定義の動作または誤動作が発生する可能性があります。

たとえば、ヘッダー ファイルに以下が含まれるとします。

#ifdef _WIN64
   int env_var;
#elseif  
   long int env_var;
#endif
ヘッダー ファイルが 2 つのインクルード パス (マクロ _WIN64 を定義するパスと定義解除するパス) に含まれる場合、env_var の定義の競合が発生する可能性があります。

例 - マクロ ガード後のコード
#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func(void);
#endif
void func2(void);

ヘッダー ファイルがこのコードを含む場合、マクロ ガードによってヘッダー ファイルのコンテンツ全体がカバーされるわけではないため、非準拠です。行 void func2(void) はガードの外部です。

メモ

マクロ ガードの外にコメントを入力できます。

例 - マクロ ガード前のコード

void func(void);
#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func2(void);
#endif

ヘッダー ファイルがこのコードを含む場合、マクロ ガードによってヘッダー ファイルのコンテンツ全体がカバーされるわけではないため、非準拠です。行 void func(void) はガードの外部です。

メモ

マクロ ガードの外にコメントを入力できます。

例 - マクロ ガード内の不一致
#ifndef  __MY_MACRO__ 
#define __MY_MARCO__
    void func(void);
    void func2(void);
#endif

ヘッダー ファイルがこのコードを含む場合、#ifndef ステートメントのマクロ名がその後の #define ステートメントのマクロ名と異なるため、非準拠です。

チェック情報

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