Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V3217. Possible overflow as a result...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

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

05 Фев 2025

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

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

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 как критические и относятся к типу: Ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.

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