V6130. Integer overflow in arithmetic expression.
Анализатор обнаружил арифметическую операцию, в результате которой возможно переполнение целочисленного числа.
Рассмотрим пример:
private static long parseHumanLong(String str) {
char tail = str.charAt(str.length() - 1);
long base = 1;
switch (tail) {
case 't':
base *= 1000 * 1000 * 1000 * 1000;
break;
case 'b':
base *= 1000 * 1000 * 1000;
break;
case 'm':
base *= 1000 * 1000;
break;
case 'k':
base *= 1000;
break;
default:
}
if (base != 1) {
str = str.substring(0, str.length() - 1);
}
return Long.parseLong(str) * base;
}
Данный метод считывает числа и переводит окончания чисел в:
t
— триллион;b
— миллиард;m
— миллион;k
— тысяча.
Ожидается, что если в метод придёт строка 1m
, то она преобразуется в переменную формата long
со значением 1_000_000
.
При расчёте триллионов в выражении 1000 * 1000 * 1000 * 1000
происходит переполнение, так как умножение выполняется в пределах int
, а итоговое число превышает максимальное значение для типа int
. Это приводит к неверному результату.
Чтобы вычисление было корректным, нужно явно указать выражению тип Long
:
base *= 1000L * 1000 * 1000 * 1000;
Данная диагностика классифицируется как:
|