Home > ラーニング > セキュアコーディング > C セキュアコーディングスタンダード > 02. 宣言と初期化 (DCL)
ある定義が他の定義に影響を与える場合には、その関係性を定義の中にコード化し、二つの独立した定義を与えないこと。このレコメンデーションで言いたいことは、一時的な関係性をコード化するということではない。
以下のコード例では、OUT_STR_LEN の定義は常に IN_STR_LEN の定義よりも2大きくなくてはならないのだが、この関係性を具現化した定義になっていない。
enum { IN_STR_LEN=18, OUT_STR_LEN=20 };
このプログラムをメンテナンスするプログラマは、そのような関係性があることを認識したうえで、それに従い両方の定義を変更する必要がある。この種のエラーは比較的害がないように思えるかもしれないが、バッファオーバーフローのような深刻な脆弱性に容易につながりうる。
以下の解決法では、2つの定義の関係性を具現化している。
enum { IN_STR_LEN=18, OUT_STR_LEN=IN_STR_LEN+2 };
こうすると、プログラマはIN_STR_LENの定義を変更することで安全にプログラムを変更することができる。
以下のコード例では、2つの定数の間に全く存在しない関係性を定義してしまっている。
enum { ADULT_AGE=18 };
/* 誤解を招く、存在しない関係が定義されている */
enum { ALCOHOL_AGE=ADULT_AGE+3 };
このプログラムをメンテナンスするプログラマは ADULT_AGE の定義を変更するかもしれないが、その結果 ALCOHOL_AGE の定義も変更されてしまうことに気づいていない。
以下の解決法では、存在しない関係性を想定していない。
enum { ADULT_AGE=18 };
enum { ALCOHOL_AGE=21 };
| レコメンデーション | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
|---|---|---|---|---|---|
| DCL08-C | 低 | 低 | 高 | P1 | L3 |
DCL08-C. Properly encode relationships in constant definitions