Quelque temps après sa correction sur PHP, le bogue étrange des nombres à virgule flottante refait surface sur un langage tout aussi populaire : Java.
Ce bogue provoquait sur PHP avant sa correction le crash du système par le passage d'un simple paramètre dans l'URL, pour peu que le script convertisse en nombres ou utilise ces variables dans des opérations arithmétiques (pour plus de détails, lire ci-devant)
Sur Java, un bogue similaire plongerait les programmes à l'exécution (ou leur compilateur) dans des boucles infinies d'après Exploring Binary, le site où ont été mis en lumière les deux bogues.
Le nombre en question, le désormais célèbre 2.2250738585072012e-308 et ses différentes représentations sont supposés être convertie en 0x1p-1022, qui correspond à la constante DBL_MIN.
Au lieu de cela, Java se retrouve coincé, oscillant sans arrêt entre les valeurs 0x1p-1022 et 0x0.fffffffffffffp-1022, le plus grand nombre dénormalisé à double précision et à virgule flottante.
Le bogue serait provoqué par la boucle de correction de la classe FloatingDecimal, chargée de trouver la meilleure approximation, qui la trouve mais la remplace et la retrouve infiniment...
Le bogue a été reporté à Oracle depuis plusieurs semaines, son rapport a récemment été assigné pour analyse interne non accessible sur Sun Developer Network (SDN).
Pour reproduire ce bogue à l'exécution des programmes, compilez et exécutez ce programme
Code : | Sélectionner tout |
1 2 3 4 5 6 7 | class runhang { public static void main(String[] args) { System.out.println("Test:"); double d = Double.parseDouble("2.2250738585072012e-308"); System.out.println("Value: " + d); } } |
Pour provoquer une boucle infinie au niveau du compilateur, il suffit de tenter de compiler cette classe :
Code : | Sélectionner tout |
1 2 3 4 5 6 | class compilehang { public static void main(String[] args) { double d = 2.2250738585072012e-308; System.out.println("Value: " + d); } } |
Source : Exploring Binary
Et vous ?
Arrivez-vous à reproduire ce bug ?
Sur quelle plateforme, architecture et version de JRE/JDK ?