Home > ラーニング > セキュアコーディング > C セキュアコーディングスタンダード > 01. プリプロセッサ (PRE)
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 はこのレコメンデーションの違反を検出することができる。