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

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

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

```cpp
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`\. Если это условие будет истинным, то при сложении гарантированно произойдёт арифметическое переполнение\.

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

```cpp
private const int _halfMaximumValue = int.MaxValue / 2;

public void Calculate(int summand)
{
  int sum;

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

  ....
}
```

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

```cpp
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` перед сложением:

```cpp
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;
    ....
  }
}
```