# V3064. Division or mod division by zero.

Анализатор обнаружил ситуацию, когда может произойти деление на ноль.

Рассмотрим пример:

    if (maxHeight >= 0)
    {
      fx = height / maxHeight;
    }

В условии проверяется, что значение переменной `maxHeight` неотрицательно. Если эта переменная будет равна нулю, то внутри условия произойдёт деление на `0`. Чтобы исправить ситуацию, необходимо выполнять деление только в том случае, когда `maxHeight` положительно.

Исправленный вариант:

    if (maxHeight > 0)
    {
      fx = height / maxHeight;
    }

Деление на значение, полученное из внешнего источника, небезопасно:

    void Division()
    {
      var divisibleStr = Request.QueryString["divisible"];
      var dividerStr = Request.QueryString["divider"];

      if (   Int32.TryParse(divisibleStr, out int divisible)
          && Int32.TryParse(dividerStr, out int divider))
      {
        int difference = divisible / divider;
      }
    }

Значение для `dividerStr`, полученное из внешнего источника, конвертируется в переменную `divider` типа `int`. Далее `divider` выступает в качестве делителя. Это может привести к делению на `0`.

Для исправления потенциальной проблемы нужно проверить `divider` перед делением:

    void Division()
    {
      var divisibleStr = Request.QueryString["divisible"];
      var dividerStr = Request.QueryString["divider"];

      if (   Int32.TryParse(divisibleStr, out int divisible)
          && Int32.TryParse(dividerStr, out int divider)
          && divider != 0) // <=
      {
        int difference = divisible / divider;
      }
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки деления на ноль [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-369

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3064.