CS.DBZ.ITERATOR

ループ反復子がゼロ除算で使用される可能性があります

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

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

CS.DBZ.ITERATOR チェッカーは、ゼロ値を確認せずに、ループの実行でゼロ定数値を割り当てられたループ反復子が明示的に使用されるか、除算やモジュロ演算の除数としてこれを使用する可能性がある関数に渡される状況にフラグを立てます。

脆弱性とリスク

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

軽減と防止

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

脆弱コード例

コピー
   namespace DBZ
   {
       class Program
       {
           static void Test12()
           {
               int sum = 12;
               for (int i = 10; i > -1; --i)
               {
                  sum = 3628800 / i;
              }
          }
      }
  }

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

修正コード例

コピー
   namespace DBZ
   {
       class Program
       {
           static void Test12()
           {
               int sum = 12;
               for (int i = 10; i > -1; --i)
               {
                  if(i != 0 )
                  {
                     sum = 3628800 / i;
                  }
              }
          }
      }
  }

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

外部参考資料

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

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