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

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

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

CWE-190 CERT-NUM00-J