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