Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V6130. Integer overflow in arithmetic expression.

26 Май 2025

Анализатор обнаружил арифметическую операцию, в результате которой возможно переполнение целочисленного числа.

Рассмотрим пример:

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;

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

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