PRE08-C. ヘッダファイル名が一意であることを保証する
インクルードするヘッダファイル名は一意となるよう配慮せよ。C 言語規格のセクション 6.10.2 第 5 段落には次のように記載されている [ISO/IEC 9899:2011]。
処理系は,一つ以上の英字又は数字(5.2.1 で定義する)の列の後ろにピリオド(.)及び一つの英字が続く形式に対して,一意の対応付けを提供しなければならない。最初の文字は,英字でなければならない。処理系は,アルファベットの大文字と小文字の区別を無視してもよく,対応付けはピリオドの前8文字に対してだけ有効であると限定してもよい
これはつまり以下を意味する。
- ファイル名の最初の8文字までは有効であることが保証されている。
- ファイル名中のピリオドの後には、非数字文字を一文字だけ持つ。
- ファイル名中の文字の大文字小文字の区別が有効であることは保証されていない。
ヘッダファイル名が一意であることを保証するには、インクルードされるすべてのファイル名が、その最初の8文字あるいは(1文字の)ファイル拡張子において(大文字小文字を区別せずに)異なっていなくてはならない。
このレコメンデーションでは、短いファイル名の使用を求めているわけではなく、ファイル名が一意であることを求めているだけであることに注意。
違反コード
以下に、ヘッダファイルをインクルードするコード例を示す。これらのヘッダファイルは、多くの環境で別々のファイルとして存在しうるのかもしれないが、C 言語規格に準拠したコンパイラがどのように解釈するかはあいまいである。
#include "Library.h" #include <stdio.h> #include <stdlib.h> #include "library.h" #include "utilities_math.h" #include "utilities_physics.h" #include "my_library.h" /* プログラムの残りの部分 */
Library.h
および library.h
は同一のファイルを参照しているかもしれない。また、ファイル名として有効であると保証されているのは最初の8文字だけなので、utilities_math.h
と utilities_physics.h
が別のファイルとして解釈されるかどうかは不明である。さらに、my_libraryOLD.h
というようなファイルが存在すると、my_library.h
の代わりにインクルードされてしまうかもしれない。
適合コード
以下の適合コードでは、上述の条件においてファイル名が一意になるように、関連するファイルのファイル名を変更してあいまいさを回避している。
#include "Lib_main.h" #include <stdio.h> #include <stdlib.h> #include "lib_2.h" #include "util_math.h" #include "util_physics.h" #include "my_library.h" /* プログラムの残りの部分 */
my_libraryOLD.h
のようなファイル名のあいまいさを避ける唯一の解決策は、(最初の8文字で元のファイル名と区別できるように)古いファイル名に接頭辞をつけるか、(たとえば my_library.h.old
のように)拡張子を追加することである。
例外
PRE08-EX1: C 言語規格では、ファイル名の先頭8文字が有効であることだけを要求しているが、今日の多くのシステムはもっと長いファイル名を扱うことができ、これらのシステム上の典型的なコンパイラは長いファイル名を区別することができる。したがって、コードが移植される先のすべての処理系がこのような長いファイル名を区別できるのであれば、ヘッダファイルに長いファイル名を使ってもよい。
リスク評価
ヘッダファイルの一意性を保証できないと、(たとえば)古いバージョンのヘッダファイルがインクルードされ、それにより間違ったマクロ定義や使わなくなった関数プロトタイプがインクルードされるなどの問題が生じる可能性がある。コンパイラは、これらの問題を検出できるかもしれないし、検出できないかもしれない。また、一意であることが保証されない長いファイル名を使うことで、移植性が問題になる可能性もある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
PRE08-C |
低 |
低 |
中 |
P2 |
L3 |
自動検出(最新の情報はこちら)
ツール | バージョン | チェッカー | 説明 |
---|---|---|---|
ECLAIR |
1.1 |
hedrname |
実装済み |
V. 9.1 |
IF_DUPL_HEADER |
||
PRQA QA-C | 8.1 | Secondary Analysis | 実装済み |
関連するガイドライン
CERT C++ Secure Coding Standard | PRE08-CPP. Guarantee that header file names are unique |
MISRA-C | Rule 19.5 |
参考資料
[ISO/IEC 9899:2011] | Section 6.10.2, "Source File Inclusion" |
翻訳元
これは以下のページを翻訳したものです。
PRE08-C. Guarantee that header file names are unique (revision 73)