CS.DBZ.GENERAL

割り当てられたゼロの定数値がゼロ除算で使用されている可能性があります

ゼロを除数として除算やモジュロ演算に使用しようとすると、ランタイムエラーが発生します。ゼロによる除算の欠陥は、効果的でないエラー処理または競合状態のためにしばしば起こります。通常、プログラム終了の異常が発生します。C# コードにおいて、値が除算またはモジュロ演算の除数として使用される前に、それがゼロに等しくないことを確認するためにチェックする必要があります。

DBZ チェッカーは、除算やモジュロ演算の除数としてゼロが使用されているインスタンスを検索します。

CS.DBZ.GENERAL チェッカーは、ゼロ定数値をローカルで割り当てられた、または関数呼び出しの結果として、変数が明示的に使用されるか、除算やモジュロ演算の除数としてこれを使用する可能性がある関数に渡される状況にフラグを立てます。

脆弱性とリスク

通常、整数をゼロで除算すると、プロセスの失敗または例外を引き起こします。また、演算は成功するかもしれませんが、誤った答えになる可能性もあります。

軽減と防止

ゼロによる除算の指摘は通常、効果的でない例外処理が原因で発生します。この脆弱性を回避するために、これを除算やモジュロ演算の除数として使用する前に、ゼロ値がないかを確認してください。

脆弱コード例

コピー
   namespace DBZ
   {
       class Program
       {
           static int Test1(int[] array, int size)
           {
               int sum = 0;
               for (int i = 0; i < 3; ++i)
               {
                  sum += array[i];
              }
              return sum / size;
          }
          static void Main(string[] args)
          {
              int size = 0;
              int[] arr = { 2, 3, 4 };
              int mean = Test1(arr, size);
         }
      }
  }

Klocwork は 18 行目で指摘レポートを生成し、'size' がゼロ除算で使用される可能性があることを表示します。

修正コード例

コピー
   namespace DBZ
   {
       class Program
       {
           static int Test1(int[] array, int size)
           {
               if(size ==0)
               {
                   return 0;
              }
              int sum = 0;
              for (int i = 0; i < 3; ++i)
              {
                  sum += array[i];
              }
              return sum / size;
          }
          static void Main(string[] args)
          {
              int size = 0;
              int[] arr = { 2, 3, 4 };
              int mean = Test1(arr, size);
         }
      }
  }

脆弱なコード例に由来する問題が修正されます。入力変数 'size' は 7 行目でゼロ定数値がチェックされ、その値がゼロの場合に除算演算が発生するのを防ぎます。

外部参考資料

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。