Je copie ton premier programme dans dlfp.c et j'essaye, sans optimisation
$ gcc dlfp.c && ./a.out
Segmentation fault
Crash, stack overflow… Normal: Récursion infinie, et chaque étape de la récursion prends un peu plus de mémoire sur la stack.
Mais attends,.. toutes tes fonctions sont des Récursion_terminale ce qui fait que, avec des optimisation, le compilateur transforme les appels de fonction en simple sauts, qui ne prennent plus aucune mémoire sur la stack.
gcc -O2 dlfp.c && ./a.out
^C
Avec des optimisation, le programme de crash plus et est coincé dans une boucle infinie. Je dois faire Ctrl+C pour l'arrêter.
Mais un programme C correct ne peut pas entrer dans une boucle infinie
La spécification du C est très claire à ce sujet.
Un compilateur assez intelligent peut remarquer que ce programme n'a pas d'effet secondaire, et juste retourner 0.
$ clang -O2 dlfp.c && ./a.out
$
Avec clang, tout le code a été optimisé et le programme ne fait plus rien et termine immédiatement.
# Crash, boucle infinie, ou programme vide ?
Posté par Gof (site web personnel) . En réponse au journal Chantonnons en récursion. Évalué à 10.
Je copie ton premier programme dans dlfp.c et j'essaye, sans optimisation
Crash, stack overflow… Normal: Récursion infinie, et chaque étape de la récursion prends un peu plus de mémoire sur la stack.
Mais attends,.. toutes tes fonctions sont des Récursion_terminale ce qui fait que, avec des optimisation, le compilateur transforme les appels de fonction en simple sauts, qui ne prennent plus aucune mémoire sur la stack.
Avec des optimisation, le programme de crash plus et est coincé dans une boucle infinie. Je dois faire Ctrl+C pour l'arrêter.
Mais un programme C correct ne peut pas entrer dans une boucle infinie
La spécification du C est très claire à ce sujet.
Un compilateur assez intelligent peut remarquer que ce programme n'a pas d'effet secondaire, et juste retourner 0.
Avec clang, tout le code a été optimisé et le programme ne fait plus rien et termine immédiatement.
À lire aussi: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html