PpHd > la formulation repousse juste le problème sous le tapis. Si le compilateur n'arrive pas à déterminer si une expression est constante ou non, il va supposer qu'elle n'est pas constante, et donc potentiellement supprimer une boucle infinie. Ça ne se produira peut-être pas pour while(1), mais rien ne dit que ça n'arrivera pas dans des cas plus complexes. C'est le raisonnement sous-jacent qui est faux : le compilateur ne devrait supprimer les boucles que s'il est certain qu'elles ne sont pas infinies. Je trouve ça complètement dingue que ceux qui rédigent les spécs soient prêts à casser quelque chose de fondamental dans le langage (et faire foirer des programmes valides) juste parce que ça permet des optimisations plus agressives. Comme disait quelqu'un, on peut faire plein d'optimisations si le résultat n'a pas besoin d'être correct...
Godzil > malheureusement, le C n'a jamais été réellement déterministe (tout comme il n'a jamais été réellement portable), il y a bien trop de choses laissées au choix du compilateur dans les spécs. Certains rétorqueront qu'il suffit d'éviter les constructions qui posent problème, mais il y a tellement de cas que je ne pense pas qu'il existe quelqu'un au monde dont tous les programmes fonctionnent correctement avec tous les compilateurs (et là, je ne parle même pas des bugs des compilos). Même la norme MISRA, qui impose un paquet de trucs, ne permet pas de garantir ça.