JPCERT コーディネーションセンター

安全・安心なIT社会のための、国内・国際連携を支援する

お問い合わせ サイトマップ English

Home > ラーニング > セキュアコーディング > C セキュアコーディングスタンダード > 01. プリプロセッサ (PRE)

  1. HTTPS

01. プリプロセッサ (PRE)

最終更新: 2010-07-26

PRE06-C. ヘッダファイルはインクルードガードで囲む

1980年代初頭までの間、大規模なソフトウェア開発プロジェクトはヘッダのインクルードについて度重なる問題に遭遇していた。たとえば、あるグループが graphics.h を作成し、このヘッダは io.h を最初にインクルードしていた。他のグループが keyboard.h を作成し、これもまた io.h をインクルードしていた。もし io.h を安全に複数回インクルードすることができなければ、どのヘッダが io.h をインクルードするべきかという議論が起こる。どのヘッダも他のヘッダを一切インクルードしてはならないという取り決めがされ、その結果あるアプリケーションプログラムは数十もの #include 行で始まったりしたこともある。またインクルードの順序を間違えたり、必要なヘッダを忘れてしまったりということもあった。

適合コード

これらの混乱は単純な手法の発見により解決した。それは、各ヘッダは「自分はすでにインクルードされています」を意味するシンボルを定義する(#defineする)という方法である。ヘッダ全体は次のようにインクルードガードの間に囲まれる。

#ifndef HEADER_H
#define HEADER_H
/* ... ヘッダの内容がここに入る */
#endif

これにより、header.h は最初の #include でその内容がすべてインクルードされる。このヘッダが続いてもう一度 #include されると、その内容はバイパスされる。

このような解決法を使うことで複数回インクルードできるヘッダファイルを作成できるため、C言語 [ISO/IEC 9899:1999] では、標準ヘッダは複数回インクルードされても安全であることを保証している。

リスク評価

ヘッダファイルをインクルードガードで囲み忘れると予期せぬ動作を引き起こすおそれがある。

レコメンデーション 深刻度 可能性 修正コスト 優先度 レベル
PRE06-C P3 L3
自動検出

LDRA tool suite V 7.6.0 はこのレコメンデーションの違反を検出することができる。

参考情報
  • [ISO/IEC 9899:1999] Section 6.10, "Preprocessing directives," Section 5.1.1, "Translation environment," and Section 7.1.2, "Standard headers"
  • [MISRA 04] Rule 19.5
  • [Plum 85] Rule 1-14
翻訳元

PRE06-C. Enclose header files in an inclusion guard

Top へ