CXX.USE.MAGIC_NUMBER

マジックナンバーの使用

数値リテラル (整数値 0 と 1 を除く) の直接使用。多くの場合、0 と 1 はマジックナンバーではなく、コードの基本的なロジックの一部です (たとえば、0 は NULL ポインターを表すことがよくあります)。そのようなケースでは、0 と 1 を使用できます。

脆弱性とリスク

マジックナンバーを使用すると、コードのメンテナンス作業が増えがちです。同じ定数が他の場所でも使用されていて、1 つ以上のインスタンスが最新状態に保たれていない場合、予期しない動作が発生する可能性があります。

軽減と防止

マジック番号を定数定義またはマクロ定義に置き換えます。

脆弱コード例

コピー
   #define MACRO 23
   enum e { start = 4, end };
   const int i = 34;
   int j = 10;  // Violation
   char c = 'c';
   char* s = "string";
   bool b = true;
   float f = 1.0;  // Violation
   
  int func (int a)
  {
    a = MACRO;
    a = e.start;
    a = i;
    a = 0;
    a = 1;
    a = 29;  // Violation
    return a;
  }

上記の例では、変数 j および f の宣言、29 へのパラメーター a の割り当ては、どれもこの規則に違反しています。文字列、文字、整数値 0 と 1 は、どれもこの規則の例外です。