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