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 の定義も変更されてしまうことに気づかないかもしれない。
適合コード
以下の適合コードでは、2つの定数を互いに関係しない形で定義している。
enum { ADULT_AGE=18 };
enum { ALCOHOL_AGE=21 };
リスク評価
| 
         レコメンデーション  | 
      
         深刻度  | 
      
         可能性  | 
      
         修正コスト  | 
      
         優先度  | 
      
         レベル  | 
    
|---|---|---|---|---|---|
| 
         DCL08-C  | 
      
         低  | 
      
         低  | 
      
         高  | 
      
         P1  | 
      
         L3  | 
    
自動検出(最新の情報はこちら)
| 
         ツール  | 
      
         バージョン  | 
      
         チェッカー  | 
      
         説明  | 
    
|---|---|---|---|
| 
         LDRA tool suite  | 
      8.5.4 | 
         387 S  | 
      
         部分的に実装済み  | 
    
関連するガイドライン
| CERT C++ Secure Coding Standard | DCL08-CPP. Properly encode relationships in constant definitions | 
参考資料
| [Plum 1985] | Rule 1-4 | 
翻訳元
これは以下のページを翻訳したものです。
DCL08-C. Properly encode relationships in constant definitions (revision 54)
