En savoir plus

Les débordements de variables

Un nombre vit dans une boîte de taille fixe. Que se passe-t-il quand on le fait grandir jusqu'à ce qu'il ne rentre plus ? Il déborde... et repart de l'autre côté.

L'idée de base : l'odomètre

Dans la plupart des langages et dans le matériel de l'ordinateur, un entier occupe un nombre fixe de bits : 8, 16, 32 ou 64. Comme l'odomètre d'une vieille voiture qui affiche 99 999 km : un kilomètre de plus et il retombe à 00 000.

Avec 16 bits signés, on peut compter de -32768 à +32767. Ajoute 1 à 32767 et... tu obtiens -32768. Le compteur a débordé (en anglais : overflow) : le programme continue de tourner, mais avec un nombre qui n'a plus aucun sens.

BoîtePlus petitPlus grand
8 bits signés-128127
16 bits signés-32 76832 767
32 bits signés-2 147 483 6482 147 483 647

Démo : fais déborder le compteur

Choisis la taille de la boîte, puis avance le compteur. Regarde les bits se remplir de 1... et ce qui arrive au moment où tout bascule. Le premier bit (en rouge) est le bit de signe.

Odomètre binaire

00000000
Valeur affichée
0
Valeur si la boîte était infinie
0

Et en Python ?

Bonne nouvelle : les int de Python grandissent autant qu'il faut, ils ne débordent jamais.

print(2 ** 1000) # 302 chiffres, aucun problème

Mais le piège revient vite, dès qu'on sort du Python pur :

import numpy compteur = numpy.int16(32767) print(compteur + numpy.int16(1)) # -32768 (débordé, sans message clair !)

Les tableaux NumPy, les fichiers binaires, les capteurs, les bases de données et presque tous les autres langages (C, Java, JavaScript...) utilisent des boîtes de taille fixe. Le float aussi a ses bords : trop grand, il devient inf.

print(1e308 * 10) # inf : le float a débordé par le haut

4 juin 1996 · Kourou, Guyane

Histoire vraie : Ariane 5, le débordement à 370 millions

Trente-sept secondes après le décollage, la toute première Ariane 5 bascule et s'autodétruit. La cause : un programme recopié d'Ariane 4 convertissait la vitesse horizontale d'un float 64 bits vers un entier 16 bits. Ariane 5 accélérait plus fort que sa grande sœur, la valeur a dépassé 32 767... et le nombre a débordé. L'ordinateur de bord, perdu, a braqué les tuyères à fond.

Autres classiques du genre : le bug de l'an 2038 (les secondes comptées sur 32 bits depuis 1970 déborderont le 19 janvier 2038) et le compteur de visionnements de YouTube, passé en 64 bits quand la chanson Gangnam Style a menacé les 2,1 milliards de vues.

Les réflexes de pro

1. Connaître la taille de ses boîtes dès qu'on quitte les int de Python (NumPy, fichiers binaires, autres langages).

2. Choisir un type assez grand pour la plus grande valeur possible du programme, pas pour la valeur d'aujourd'hui : c'est l'erreur d'Ariane 5.

3. Se méfier des résultats absurdes : un compteur qui devient négatif ou un total qui rajeunit, c'est la signature d'un débordement.

Complément jumeau : les erreurs d'arrondi, quand c'est la précision de la boîte qui trahit plutôt que sa taille.