Em geral, é difícil (isto é, indecidível) provar se algo é um loop de ocupado tolo (que pode ser otimizado) ou um loop infinito (que não pode ser otimizado sem alterar o significado do programa). O código a seguir faz um loop para sempre ou para?
var n = //some positive integer
while(n != 1){
if(n % 2 == 0)
n = n/2;
else
n = 3*n+1
}
Devido a essa complexidade, a maioria das linguagens de programação desistem de tentar raciocinar muito sobre o programa e, portanto, passam a responsabilidade de não executar loops ocupados para o programador.