# V6108. Do not use real-type variables in 'for' loop counters.

Анализатор обнаружил переменную вещественного типа в качестве счётчика цикла 'for'. Поскольку числа с плавающей точкой не могут точно отобразить все действительные числа, использование таких переменных в цикле может привести к неожиданным результатам, таким как лишние итерации.

Рассмотрим подробнее:

    for (double i = 0.0; i < 1.0; i += 0.1) {
        ....
    }

Количество итераций в этом цикле будет равно 11 вместо ожидаемых 10. При выполнении кода без модификатора 'strictfp' в версиях Java ниже 17-ой результат операций с плавающей точкой может также зависеть от платформы. Чтобы избежать возможных проблем, следует использовать целочисленный тип для счётчика, а вычисления производить внутри:

    for (var i = 0; i < 10; i++) {
        double counter = i / 10.0;
        ....
    }

Дополнительной причиной не использовать действительный тип может быть опасность бесконечного цикла. В качестве примера — следующий фрагмент:

    for (float i = 100000000.0f; i <= 100000009.0f; i += 0.5f) {
        ....
    }

Он возникает из-за слишком маленького инкремента относительно количества значащих цифр. Для предотвращения такой ситуации лучше также использовать целочисленный тип счётчика, а во избежание потери точности использовать 'double' для хранения значения:

    for (var i = 0; i < 19; i++) {
        double value = 100000000.0d + i / 2d;
        ....
    }

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

CWE-834 CERT-NUM09-J