V8016. The loop may be executed incorrectly or its condition will never be met. Inspect initial and final values in the 'for' loop.
Анализатор обнаружил ошибку, связанную с тем, что в цикле for совпадают начальное и конечное значения счётчика.
Это может привести к нескольким проблемам:
- не будет ни одной итерации цикла;
- будет только одна итерация цикла;
- будет больше итераций, чем предполагалось.
Рассмотрим пример для каждого из случаев.
Пример N1. Цикл не выполняется:
func processRange(begin int, end int) {
for i := begin; i < begin; i++ {
....
}
}
Перед первой итерацией цикла будет выполнена проверка i < begin. Данное условие всегда ложное, так как фактически проверяется, что begin < begin.
Для исправления нужно использовать параметр end в условии цикла:
func processRange(begin int, end int) {
for i := begin; i < end; i++ {
....
}
}
Пример N2. Цикл выполняет не более одной итерации:
func processRange(begin int, end int) {
for i := end; i >= end; i-- {
....
}
}
Перед первой итерацией выполнится проверка i >= end, что является истиной, поскольку значение i совпадает со значением end. Перед второй итерацией значение i уменьшается на единицу. Фактически вторая проверка примет вид end - 1 >= end, что является ложным. Следовательно, цикл выполнится всего один раз.
Для исправления нужно изменить условие выхода из цикла:
func processRange(begin int, end int) {
for i := end; i >= begin; i-- {
....
}
}
Пример N3. Больше итераций, чем предполагалось:
func processRange(begin int, end int) {
for i := end; i >= end; i++ {
....
}
}
Перед первой итерацией условие i >= end будет истинным, поскольку значение i совпадает со значением end. При последующих проверках значение i увеличивается, а значение end остаётся без изменений. Следовательно, данный цикл завершится, когда значение счётчика i переполнится.
Для исправления нужно использовать параметр begin для инициализации i и изменить условие выхода из цикла:
func processRange(begin int, end int) {
for i := begin; i <= end; i++ {
....
}
}