# V3217. Possible overflow as a result of an arithmetic operation.

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

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

    private const int _halfMaximumValue = int.MaxValue / 2;

    public void Calculate(int summand)
    {
      int sum;

      if (summand > _halfMaximumValue + 1)
      {
        sum = _halfMaximumValue + summand;
      }

      ....
    }

В методе `Calculate` высчитывается сумма переданного параметра и константы. Константа равна половине от максимального значения `System.Int32`. Перед сложением проверяется значение параметра, чтобы избежать арифметического переполнения.

Однако в условии была допущена ошибка. В данном случае проверяется, что `summand` больше, чем `_halfMaximumValue + 1`. Если это условие будет истинным, то при сложении гарантированно произойдёт арифметическое переполнение.

Чтобы проверка выполнялась корректно, нужно заменить оператор `>` на `<`:

    private const int _halfMaximumValue = int.MaxValue / 2;

    public void Calculate(int summand)
    {
      int sum;

      if (summand < _halfMaximumValue + 1)
      {
        sum = _halfMaximumValue + summand;
      }

      ....
    }

Переполнение возможно при использовании непроверенных внешних данных в качестве одного из операндов:

    private const int _halfMaximumValue = int.MaxValue / 2;

    public void Calculate()
    {
      var numberStr = Request.QueryString["number"];

      if (Int32.TryParse(numberStr, out int number))
      {
        int sum = _halfMaximumValue + number;
        ....
      }
    }

Значение для `numberStr`, полученное из внешнего источника, конвертируется в переменную `number` типа `int`. Далее `number` складывается с `_halfMaximumValue`. Это может привести к переполнению, если значение `number` будет больше половины максимального значения `int`.

Чтобы избежать переполнения, нужно ограничить `number` перед сложением:

    private const int _halfMaximumValue = int.MaxValue / 2;

    public void Calculate()
    {
      var numberStr = Request.QueryString["number"];

      if (   Int32.TryParse(numberStr, out int number)
          && number < 1000) // <=
      {
        int sum = _halfMaximumValue + number;
        ....
      }
    }

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

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

CWE-190 CWE-191