En effet, ce fameux bug n'est nullement spécifique à PHP et peut impacter d'autres langages, voir même des programmes qui n'ont rien à voir avec un langage de programmation.

Il trouve en effet son origine au sein de l'unité de calcul en virgule flottante x87 des processeurs x86 32 bits qui est, assez paradoxalement, trop précise, puisqu'elle utilise 80 bits pour effectuer ses calculs.

De ce fait, cette unité, encore présente dans les micro-processeurs d'aujourd'hui pour des raisons de compatibilité, se révèle incapable de gérer correctement le nombre en question, ce qui provoque la boucle infinie au sein du Zend Engine.

Heureusement, elle a été remplacé au sein des processeurs  x86 par le module SSE il y a un peu plus de 10 ans, qui lui est moins précis puisqu'il gère les nombres à virgule flottante sur 64 bits, suivant en cela la norme IEE 754.

Il devrait donc être utilisé, via les compilateurs, à la place de x87.

Sauf que GCC, le compilateur utilisé traditionnellement pour produire le binaire de PHP, n'est pas capable, par défaut, d'utiliser le module SSE à la place de x87, et cela malgré que le problème ait été rapporté en... juin 2000 !

Or, la gestion des nombres en virgule flottante est une chose complexe en informatique, puisque de part son fonctionnement binaire, un ordinateur ne peut manipuler que des approximations de ces nombres.

Les développeurs du monde entier ont donc été très content, quand, en 1991, un certain David M. Gay a publié un peu plus de 2500 lignes de code écrit en C permettant de les gérer efficacement, à tel point que son code a été repris et intégré dans énormément de programme informatique, dont PHP.

En résumé, tout programme manipulant des nombres en virgule flottante à la façon de David M. Gay et compilé à l'aide de GCC ou d'un compilateur faisant appel à l'unité de calcul en virgule flottante x87 contient potentiellement le même style de bug .

C'est assez effrayant, non ?

J'en vois déjà me dire que ce n'est pas possible et que je fabule complètement.

Et pourtant, le même style de problème vient d'être découvert dans Java !

Le problème a été rapporté à Oracle il y a maintenant trois semaines, mais pour le moment, l'auteur du rapport de bug n'a reçu aucune réponse et aucun correctif n'a été apporté.

Je suis assez curieux de voir combien de temps cela va prendre pour que le problème soit corrigé, sachant qu'il a fallu 8 jours aux développeurs de PHP pour trouver l'origine du problème et apporter une solution, qui tient en un mot.