Причина, по которой GCC предупреждает вас, заключается в том, что он использует небезопасную оптимизацию. Вместо
for (x = startx; x <= endx; ++x, ++xptr)
в основном использует:
for( x = startx; x < (endx+1); ++x, ++xptr)
, что верно, только если endx+1
не переполняется, но это происходит, когда endx
является максимально возможным значением, что означает, что x <= endx
всегда верно. Компилятор предполагает, что этого не происходит.
Предупреждение иногда немного сбивает с толку, потому что здесь дело не в конечности цикла. Я не знаю, есть ли лучший кандидат для сообщения, которое было бы достаточно коротким для предупреждения компилятора.
Один пример - это случай, когда, например, x
и endx
являются целыми числами, оптимизация фактически может быть интерпретирована как разрешенная стандартом, если endx==MAX_INT
у вас будет условие истинно, что приведет к этому x
в конечном итоге переполняется, что является неопределенным поведением, это означает, что компилятор может предположить, что этого не происходит. Полное пропускание цикла - это стандартное поведение, соответствующее этой интерпретации.
Другой случай, если программа не завершает работу во время цикла или изменяет энергозависимую память (т. Е. Имеет наблюдаемое поведение), что означает, что бесконечный цикл означает неопределенное поведение (IIRC, по крайней мере компилятор может предположить, что это не ' не бывает).