JPCERT コーディネーションセンター

安全・安心なIT社会のための、国内・国際連携を支援する

お問い合わせ サイトマップ English

Home > ラーニング > セキュアコーディング > C セキュアコーディングスタンダード > 02. 宣言と初期化 (DCL)

  1. HTTPS

02. 宣言と初期化 (DCL)

最終更新: 2010-07-26

DCL08-C. 定数定義間の関係は適切にコード化する

ある定義が他の定義に影響を与える場合には、その関係性を定義の中にコード化し、二つの独立した定義を与えないこと。このレコメンデーションで言いたいことは、一時的な関係性をコード化するということではない。

違反コード

以下のコード例では、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
参考情報
  • [ISO/IEC 9899:1999] Section 6.10, "Preprocessing directives," and Section 5.1.1, "Translation environment"
  • [Plum 85] Rule 1-4
翻訳元

DCL08-C. Properly encode relationships in constant definitions

Top へ