PRE04-C. 標準ヘッダファイル名を再利用しない
標準ヘッダと同じ名前のファイルが、インクルードされるソースファイルのサーチパスにある場合、動作は未定義である。
以下の表に C 標準 [ISO/IEC 9899:2011] セクション 7.1.2 の標準ヘッダを列挙する。
<assert.h> |
<float.h> |
<math.h> |
<stdatomic.h> |
<stdlib.h> |
<time.h> |
<complex.h> |
<inttypes.h> |
<setjmp.h> |
<stdbool.h> |
<stdnoreturn.h> |
<uchar.h> |
<ctype.h> |
<iso646.h> |
<signal.h> |
<stddef.h> |
<string.h> |
<wchar.h> |
<errno.h> |
<limits.h> |
<stdalign.h> |
<stdint.h> |
<tgmath.h> |
<wctype.h> |
<fenv.h> |
<locale.h> |
<stdarg.h> |
<stdio.h> |
<threads.h> |
標準ヘッダファイル名、システム固有のヘッダファイル名、その他のヘッダファイル名を再利用しないこと。
違反コード
以下のコード例では、プログラマは、標準ライブラリのローカル版を使おうとしているが違いを明確にしていない。
#include "stdio.h" /* 混乱を招く。<stdio.h> とは異なる */ /* ... */
適合コード
以下の適合コードでは、ローカルライブラリに一意の名前をつけることで問題に対処している(「PRE08-C. ヘッダファイル名が一意であることを保証する」にあるように)。こうすることで、使用しているライブラリがオリジナルのものではないことが明確になる。
/* ローカル版の stdio.h を使っている */ #include "mystdio.h" /* ... */
リスク評価
他のヘッダファイル名と衝突するヘッダファイル名を使用すると、間違ったファイルがインクルードされてしまう恐れがある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
PRE04-C |
低 |
低 |
中 |
P2 |
L3 |
自動検出(最新の情報はこちら)
ツール | バージョン | チェッカー | 説明 |
---|---|---|---|
ECLAIR |
1.1 |
hedrname |
実装済み |
LDRA tool suite |
V. 8.5.4 |
218 S |
実装済み |
PRQA QA-C | 8.1 | Secondary analysis | 実装済み |
関連するガイドライン
CERT C++ Secure Coding Standard | PRE04-CPP. Do not reuse a standard header file name |
Java セキュアコーディングスタンダード CERT/Oracle 版 | DCL01-J. Java標準ライブラリが使用するパブリック宣言された識別子を再利用しない |
参考資料
[ISO/IEC 9899:2011] | Section 7.1.2, "Standard Headers" |
翻訳元
これは以下のページを翻訳したものです。
PRE04-C. Do not reuse a standard header file name (revision 79)