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