DCL02-C. 視覚的に区別できる識別子を使う
識別子は、オブジェクト、関数、構造体、共用体、列挙体のタグまたはメンバ、typedef 名、ラベル名、マクロ名、マクロ引数、などを示す。視覚的に区別でき、意味のある名前をもつ識別子を使い、開発中やコードレビューの際に識別子の綴りを読み間違えることによって引き起こされるエラーを無くすこと。
使用されるフォントによっては、ある種の文字は視覚的によく似ていたり、まったく同じ場合さえある。
シンボル |
よく似たシンボル |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ひとつかそこいらの視覚的によく似た文字だけ異なるような識別子を複数定義しないこと。
長い識別子の最初の部分を一意かつ見分けやすいようにしてやること。こうすることで、一意でない識別子が引き起こす問題を回避することにもつながる。(「DCL32-C. 相互に可視である識別子が一意であることを保証する」を参照)。
また、識別子のスコープが広がれば、それに伴って識別子の名前はより説明的になる。ループ制御変数を i
と名付けるのはまったく問題ないだろうが、ファイルスコープオブジェクトや関数のローカル変数に数行を超える長さの名前を付ける場合、同じ名前が混乱を招く可能性がある。「DCL01-C. サブスコープで変数名を再利用しない」および「DCL19-C. 全ての変数および関数に対して最小限の有効範囲を用いる」も参照。
違反コード (ソース文字セット)
DCL02-C は、暗黙的に、グローバルスコープ を想定する。このため、同じファイル内のスコープ と混同される可能性がある。エラーは生成されないかもしれないが、以下の例に示すように、ルールの違反が発生する可能性がある。この例は、「DCL32-C. 相互に可視である識別子が一意であることを保証する」 には違反していないことに注意。
ファイル foo.h
で
int id_O; // (大文字の O)
ファイル bar.h
で
int id_0; // (数字の 0)
ファイル foobar.c
が foo.h
と bar.h
の両方を含む場合、id_0
も id_0
も同じスコープに入るため、このルールの違反が発生する。
適合コード (ソース文字セット)
適合コードは、同じプロジェクトスコープでの視覚的によく似た識別子の使用を避けている。
ファイル foo.h
で
int id_a;
ファイル bar.h
で
int id_b;
リスク評価
視覚的に区別できる識別子を使用しないと、間違ったオブジェクトや関数が参照され、意図せぬプログラムの動作を引き起こす可能性がある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
DCL02-C |
低 |
低 |
中 |
P2 |
L3 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
Compass/ROSE |
|
|
|
ECLAIR |
1.1 |
idntsiml |
実装済み |
LDRA tool suite |
V. 8.5.4 |
67 X |
実装済み |
PRQA QA-C | 8.1 | 0777(U) | 部分的に実装済み |
関連するガイドライン
CERT C++ Secure Coding Standard | DCL02-CPP. Use visually distinct identifiers |
ISO/IEC TR 24772:2013 | Choice of Clear Names [NAI] |
MISRA-C | Rule 5.6 |
翻訳元
これは以下のページを翻訳したものです。
DCL02-C. Use visually distinct identifiers (revision 108)