DCL23-C. 相互に可視である識別子が一意であることを保証する
C 標準 [ISO/IEC 9899:2011] セクション 6.2.7 には、次のように記載されている
同じオブジェクトまたは関数を参照するすべての宣言が、互換性のある型をもつ必要があり、もたない場合、その動作は未定義である。
(C99 の附属書 J 「未定義の動作」の 15 も参照。)
さらに、セクション 6.4.2.1 には次のように記載されている
有効文字が異なる識別子は、別の識別子である。2 つの識別子の有効文字以外の文字だけが異なる場合、動作は未定義である。
(C99 の附属書 J 「未定義の動作」の 31 も参照。)
相互に可視であるスコープ内の識別子は、どの変数や関数が参照されているのか混乱が生じないようにするため、処理系が一意であるとみなせなければならない。処理系は、ソースコード上では区別がつかない識別子を区別して扱うため、内部的に一意でない文字を識別子の最後に追加した形で扱うことができる。
相互に可視でないスコープが重複する識別子を持つことは構わない。たとえば、2 つの関数は、それぞれのスコープが相互に可視ではないため、それぞれ同じ名前のローカル変数を持ってもよい。しかし、1つの関数内の複数のローカル変数の名前は相互に区別できる必要があり、またその関数が定義されているファイル内で(およびインクルードされるすべてのヘッダファイルから)宣言されたすべての静的変数とも区別できる必要がある。
識別子が一意であることを保証するには、使用する最も制約の厳しいコンパイラが認識できる有効文字数を割り出さなければならない。この制約条件はコードに明記しなければならない。
言語規格は次のような最小要件を定めている。
- 内部識別子またはマクロ名において意味がある文字数は先頭 63 文字(各ユニバーサル文字名またはソース拡張文字は 1 文字とみなされる)。
- 外部識別子において意味がある文字数は先頭 31 文字(0000FFFF 以下の短い識別子を表す各ユニバーサル文字名は 6 文字とみなされる。00010000 以上の短い識別子を表す各ユニバーサル文字名は 10 文字とみなされる。各ソース拡張文字は、存在する場合、対応するユニバーサル文字名と同じ文字数とみなされる)。
外部名の有効文字数を255文字よりも少なくするという言語規格上の制限は(各ユニバーサル文字名またはソース拡張文字を1文字とみなす)、既存の実装を許容するための古い機能である。したがって、識別子が一意であり、有効文字数に関する前提が明記されている限り、この制限に従う必要はない。
違反コード (ソース文字セット)
言語規格が要求する有効文字の最小要件のみをサポートする処理系では、以下のコード例は外部識別子の最初の 31 文字が同じため、ルールに違反している。
extern int *global_symbol_definition_lookup_table_a; extern int *global_symbol_definition_lookup_table_b;
適合コード (ソース文字セット)
適合コードでは、各識別子の有効文字は異なっている必要がある。
extern int *a_global_symbol_definition_lookup_table; extern int *b_global_symbol_definition_lookup_table;
違反コード (ユニバーサル文字名)
以下のコード例では、どちらの外部識別子も 4 つのユニバーサル文字名で構成されている。各識別子の最初の 3 つのユニバーサル文字名が同じため、どちらも同じ整数配列を表してしまう。
extern int *\U00010401\U00010401\U00010401\U00010401; extern int *\U00010401\U00010401\U00010401\U00010402;
適合コード (ユニバーサル文字名)
移植性を高めるには、識別子で使用する最初の 3 つのユニバーサル文字名の組み合わせが一意でなければならない。
extern int *\U00010401\U00010401\U00010401\U00010401; extern int *\U00010402\U00010401\U00010401\U00010401;
リスク評価
一意でない識別子は、プログラムの異常終了や、サービス運用妨害(DoS)攻撃、意図しない情報漏えいを引き起こす可能性がある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
DCL23-C |
中 |
低 |
低 |
P6 |
L2 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
Compass/ROSE |
|
|
このルールの違反を検出できる。しかし、ユニバーサル文字が含まれている場合は検出できない。 |
LDRA tool suite |
V. 8.5.4 |
17 D |
実装済み |
PRQA QA-C | 8.1 |
0777 (U) |
部分的に実装済み |
関連するガイドライン
ISO/IEC TR 24772:2013 | Choice of Clear Names [NAI] Identifier Name Reuse [YOW] |
MISRA-C | Rule 5.1 Rule 8.9 |
参考資料
[ISO/IEC 9899:2011] |
Section 6.2.7, "Compatible Type and Composite Type" |
翻訳元
これは以下のページを翻訳したものです。
DCL23-C. Guarantee that mutually visible identifiers are unique (revision 82)