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);
         }
      }
  }

漏洞代码示例中的问题已得到修正。在第 7 行检查输入变量 size 是否为零常量值,如果值为零则阻止出现除法运算。

外部指导

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。