Чем объясняется «предупреждение: предполагая, что цикл не бесконечен» - PullRequest
13 голосов
/ 06 июня 2010

Я только что принял решение изменить столько переменных с unsigned на int, и после перекомпиляции соответствующего кода меня приветствовало это предупреждение:

freespace_state.c:203: warning: assuming that the loop is not infinite

Соответствующая строка:

for (x = startx; x <= endx; ++x, ++xptr)

Этот цикл состоит из 60 строк кода (включая пробелы / квадратные скобки и т. Д.) И содержит goto в нем и, по крайней мере, одно вхождение continue.

В этом случае, я думаю, я благодарен, что GCC предполагает, что этот цикл не является бесконечным, потому что он никогда не должен выполняться бесконечно.

Что GCC пытается сказать мне здесь?

Грамматика предупреждения почти наводит на мысль, что предупреждение следует принимать в контексте какого-либо другого предупреждения, но в этом контексте их нет.

[править] Это все полностью моя вина.Я украл некоторые варианты оптимизации и предупреждения из вопроса где-то здесь, не понимая их, и с тех пор забыл о них.

См. Ответ Марка Рушакова, и, кроме того, я также использовал -Wunsafe-loop-optimizations, чтобы явно предупреждатьесли GCC делает предположения о цикле.См http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Ответы [ 3 ]

13 голосов
/ 06 июня 2010

Согласно этому исправлению GCC от 2005 , похоже, что GCC выполняет "оптимизацию небезопасного цикла" (и вас предупреждают, потому что установлено -funsafe-loop-optimizations). Если цикл равен бесконечен, эта конкретная оптимизация каким-то образом завершится неудачей.

Поскольку вы сказали, что это завершающий цикл, похоже, вам не о чем беспокоиться.

Еще одна важная часть патча:

@opindex Wunsafe-loop-optimizations
Warn if the loop cannot be optimized because the compiler could not
assume anything on the bounds of the loop indices.  With
@option{-funsafe-loop-optimizations} warn if the compiler made
+such assumptions.
0 голосов
/ 31 мая 2016

Причина, по которой 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, по крайней мере компилятор может предположить, что это не ' не бывает).

0 голосов
/ 06 июня 2010

Я думаю, что GCC говорит вам, что не может определить, что цикл не является бесконечным и продолжает компиляцию независимо Это предупреждение, а не ошибка, о которой вы можете подумать.

...