• # Crash, boucle infinie, ou programme vide ?

    Posté par (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

    $ 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.

    À lire aussi: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html