Boucle infinie

Écran bleu de la mort à cause d'une boucle infinie.

Une boucle infinie est, en programmation informatique, une boucle dont la condition de sortie n'a pas été définie ou ne peut pas être satisfaite. En conséquence, la boucle ne peut se terminer qu'à l'interruption du programme qui l'utilise.

Pourquoi est-ce un problème ?

Il y a rarement un intérêt à programmer une boucle infinie. Une telle boucle ne permet pas de faire sortir un résultat, et accapare les ressources de l'ordinateur.

Sur un système monotâche, une boucle infinie peut interdire à l'utilisateur toute autre action. Il faut alors interrompre de force l'exécution (on peut être obligé de couper l'alimentation de l'ordinateur).

Les systèmes modernes sont généralement suffisamment multitâches pour laisser le contrôle à l'utilisateur, qui peut commander l'interruption du programme. Mais tant que ce n'est pas fait, l'ordinateur se retrouve beaucoup moins performant pour tout autre travail.

Une boucle infinie est donc presque toujours considérée comme un bug.

Une exception possible est celle d'un programmeur qui souhaiterait absolument maintenir son ordinateur en activité en son absence. Il peut donc programmer une boucle infinie en s'assurant qu'il pourra l'interrompre quand il le souhaitera.

Exemples de boucles infinies

Dans de nombreux langages de programmation, la boucle infinie la plus simple est, en pseudo-code :

tant que VRAI

ou en anglais

while TRUE

C'est-à-dire que les instructions doivent être exécutées tant que l'évaluation de l'expression logique « VRAI » a comme résultat « VRAI ».

En Python par exemple, une boucle infinie peut être définie comme ceci :

while True:
    print("Boucle infinie")

L'instruction contenue dans la boucle s'exécute tant que la condition définie après while, or ici cette condition est toujours vraie (True).

La situation suivante crée également une boucle infinie :

i = 0
while i < 10:
    i = 1

En effet, la boucle se termine lorsque i n'est plus inférieur à 10, or l'instruction présente dans la boucle donne toujours à i la valeur 1 ; la condition d'entrée de la boucle est donc toujours vraie.

En C, en C++ ou en PHP, on peut trouver :

PHP :

<?php
    while(true)
        {
            //Code à insérer
        }
?>

C :

int i = 0;
while (i < 1) {
    // Instructions
}

La variable $i ou i n'est pas incrémentée (on ne lui ajoute pas 1) et par conséquent la condition sera toujours vérifiée car $i ou i = 0 < 1.

Boucles à condition d'arrêt

La structure décrite précédemment, while true, n'est pas forcément absurde. On peut, dans un langage comme le C, créer une boucle pseudo-infinie, dont la condition après le while est toujours respectée, tout en utilisant à l'intérieur de la boucle l'instruction break qui fait sortir de la boucle. Simplement, il faut s'assurer que la condition du break sera forcément atteinte, de préférence après un délai raisonnable.

On appelle boucle d'Alderson le cas particulier de boucle infinie pour lequel la boucle est infinie quant à sa condition d'entrée, a une condition d'arrêt, mais qu'une erreur de conception rend cette condition inaccessible. Dans ce cas, c'est bien sûr un bug. Alderson est un programmeur qui avait codé une fonction qui exécutait des instructions suivant que l'utilisateur clique sur « OK » ou « annuler », sans avoir affiché les boutons en question[1].

Récursion infinie

L'exemple suivant en VBA renvoie une erreur de dépassement de pile :

Sub Test1()
  Call Test1
End Sub

Dans la culture informatique

Une vieille blague d'informaticien disait qu'« un Cray-3 est si rapide qu'il peut exécuter une boucle infinie en moins de 2 secondes »[2].

L'allée des bâtiments d'Apple à Cupertino s'appelle Infinite Loop, « boucle infinie » en anglais.

Notes et références

Voir aussi

Articles connexes