То, на что ссылается Джон, описано в разделе 8.1 спецификации. Компилятор может обнаруживать только очень простые бесконечные циклы, например:
while(true) { if (0 != 0) return 123; }
Компилятор достаточно умен, чтобы видеть, что возвращение никогда не достигается, и, следовательно, цикл работает вечно. Законно, хотя и безумно, сказать:
int M() { while(true) { } }
потому что, хотя нет пути, который возвращает int, также нет пути, который возвращает без , возвращающего int!
Компилятор недостаточно умен, чтобы найти другие виды бесконечных циклов. Например:
int x = 123;
while(true) { if (x * 0 != 0) break; }
Это явно бесконечный цикл. Но компилятор этого не знает. Компилятор говорит: «Ну, может быть, есть какое-то значение x, где x * 0 не равно нулю, поэтому разрыв достижим, поэтому это не бесконечный цикл». Мы с тобой знаем, что это невозможно, потому что мы знаем математику, а компилятор - нет.
Прочтите раздел 8.1, если хотите узнать подробности.