CS.DBZ.CONST.CALL

ゼロ定数値が関数に渡され、ゼロによる除算で使用される可能性があります。

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

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

CS.DBZ.CONST.CALL チェッカーは、ゼロ値を確認せずに、明示的なゼロ定数値が関数呼び出しに直接渡され、除算やモジュロ演算の除数として使用される可能性がある状況にフラグを立てます。

脆弱性とリスク

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

軽減と防止

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

脆弱コード例

コピー
   namespace DBZ
   {
       class Program
       {
           static int Test1(int a, int size)
           {
               return a / size;
           }
           static void Main(string[] args)
          {
              int mean = Test1(0, 0);
         }
      }
  }

Klocwork は 11 行目で指摘レポートを生成し、11 行目で引数 2 を関数 'Test1' に渡すことにより、値 '0' がゼロ除算で使用される可能性があることを示します。

修正コード例

コピー
   namespace DBZ
   {
       class Program
       {
           static int Test1(int a, int size)
           {
               if(size ==0)
               { 
                  return 0
              }
              return a / size;
          }
          static void Main(string[] args)
          {
              int mean = Test1(0, 0);
         }
      }
  }

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

外部参考資料

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

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