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.
Pour l’article homonyme, voir Infinite Loop.
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 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
- Entrée « Alderson Loop », dans le Jargon File, version 4.4.7.
- Entrée « infinite loop », dans le Jargon File, version 4.4.7.
- Portail de la programmation informatique