Le comportement indéfini d’une boucle infinie (vide) est-il en C?

Est une boucle infinie comme for (;;); comportement indéfini en C? (C’est pour C ++ , mais je ne sais pas pour C.)

Non, le comportement d’une instruction for (;;) est bien défini en C.

N1570 , qui est essentiellement identique à la norme ISO C officielle de 2011, dit, au paragraphe 6 de la section 6.8.5:

Une instruction d’itération dont l’expression de contrôle n’est pas une expression constante, qui n’effectue aucune opération d’entrée / sortie, n’accède pas aux objects volatils et ne réalise aucune opération de synchronisation ou atomique dans son corps, expression de contrôle ou (dans le cas d’une instruction for ) son expression-3 , peut être supposée par la mise en œuvre se terminer.

avec deux notes de bas de page:

Une expression de contrôle omise est remplacée par une constante non nulle, qui est une expression constante.

Ceci est destiné à permettre des transformations du compilateur telles que la suppression des boucles vides même lorsque la terminaison ne peut pas être prouvée.

La première note de bas de page indique clairement que for (;;) est traité comme s’il avait une expression de contrôle constant.

Le but de la règle est d’autoriser les optimisations lorsque le compilateur ne peut pas prouver que la boucle se termine. Toutefois, si l’expression de contrôle est constante, le compilateur peut prouver de manière sortingviale que la boucle se termine ou non, de sorte que l’autorisation supplémentaire n’est pas nécessaire.

La justification de cette question concernant C ++ n’est pas pertinente pour C. La section 5.1.2.3p6 indique les limites de l’optimisation, et l’une d’entre elles est:

A la fin du programme, toutes les données écrites dans les fichiers doivent être identiques au résultat obtenu par l’exécution du programme conformément à la sémantique abstraite.

Maintenant, la question devient “Quelles données une exécution selon la sémantique abstraite aurait-elle produite?”. En supposant qu’un signal interrompt la boucle, le programme peut très bien se terminer. La sémantique abstraite n’aurait cependant produit aucune sortie avant que ce signal ne soit émis. Au contraire, le compilateur peut optimiser les puts("Hello"); une façon.