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;
}

Данный метод считывает числа и переводит окончания чисел в:

Ожидается, что если в метод придёт строка 1m, то она преобразуется в переменную формата long со значением 1_000_000.

При расчёте триллионов в выражении 1000 * 1000 * 1000 * 1000 происходит переполнение, так как умножение выполняется в пределах int, а итоговое число превышает максимальное значение для типа int. Это приводит к неверному результату.

Чтобы вычисление было корректным, нужно явно указать выражению тип Long:

base *= 1000L * 1000 * 1000 * 1000;

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.

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