mageekblog - À propos du bug 53632 de PHP - CommentairesLe blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearÀ propos du bug 53632 de PHP - mageekguyurn:md5:912efa44d333cb1ecd176c9e792456e72011-02-18T13:06:04+01:002011-02-18T13:07:16+01:00mageekguy<p>@<a href="http://blog.mageekbox.net/?post/2011/02/01/%C3%80-propos-du-bug-53632-de-PHP#c2722" rel="nofollow">haypo</a> : Je me suis permis d'éditer ton commentaire au niveau des liens que tu y avais mis, car ils étaient déjà tous présents, soit dans le billet, soit dans les commentaires précédents.</p>À propos du bug 53632 de PHP - haypourn:md5:d62a7c30888061f6710661eca2f796562011-02-18T11:17:22+01:002011-02-18T13:05:55+01:00haypo<p><q>Comme indiqué dans le billet, il faut être en 32 bits, et que le programme utilise le code de M. David M. Gay pour gérer les arrondies sur les flottants.</q></p>
<p>Le bug est reproductible en 64 bits si le compilateur utilise x87 plutôt que SSE (x87 offre une meilleure précision, mais est un plus lent).</p>
<p>Par contre j'ai vérifié : Python n'utilise pas le même code que PHP pour convertir une chaîne en nombre flottant, ce qui explique que même si Python utilise x87 sur AMD64, il n'ait pas le même bug que PHP.</p>
<p> Par contre, depuis les versions 2.7 et 3.1, Python utilise le code de David Gay pour l'opération inverse (formatter un nombre flottant sous forme d'une chaîne de caractères) : <a href="http://bugs.python.org/issue7117." title="http://bugs.python.org/issue7117." rel="nofollow">http://bugs.python.org/issue7117.</a></p>
<p>Ceci permet une représentation plus compacte des nombres flottants.</p>
<p>Python a bénéficié ces derniers mois (dernières années ?) d'un important travail de notre expert en calcul numérique : Mark Dickinson.</p>
<p> Il a d'ailleurs trouvé un bug dans le code de David Gay (toujours dans le sens nombre => chaîne) et l'a contourné (au lieu de le remonter upstream à David, rooh) : <a href="http://www.exploringbinary.com/incorrect-directed-conversions-in-david-gays-strtod/" title="http://www.exploringbinary.com/incorrect-directed-conversions-in-david-gays-strtod/" rel="nofollow">http://www.exploringbinary.com/inco...</a></p>
<p><q>Quand à volatile, son utilisation force le cast sur 64 bits dont tu parles...</q></p>
<p>En fait, je pensais qu'il existait une manière plus élégante d'indiquer au compilateur qu'on voulait que le résultat d'une opération soit stockée en 64 bits plutôt qu'en 80 bits, mais il semble que non.</p>
<p>Je retire ce que j'ai dit.</p>À propos du bug 53632 de PHP - mageekguyurn:md5:07b734521c306bd8c6305ac62664d8a62011-02-11T17:00:02+01:002011-02-11T17:01:52+01:00mageekguy<p>@<a href="http://blog.mageekbox.net/?post/2011/02/01/%C3%80-propos-du-bug-53632-de-PHP#c2715" rel="nofollow">haypo</a> : Comme indiqué dans le billet, il faut être en 32 bits, et que le programme utilise le code de M. <span class="pygments-cm">David M. Gay pour gérer les arrondies sur les flottants.</span></p>
<p><span class="pygments-cm">Quand à <code>volatile</code>, son utilisation force le cast sur 64 bits dont tu parles...<br /></span></p>À propos du bug 53632 de PHP - haypourn:md5:0ddaa2fcae4f512da5541117eeabc7f92011-02-11T11:57:50+01:002011-02-11T16:59:56+01:00haypo<p>"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."</p>
<p>C'est possible, mais Python n'a pas ce bug. J'ai recompilé Python en forçant GCC à utiliser x87 plutôt que SSE (en 64 bits, GCC utilise SSE par défaut), et je n'ai pas réussi à avoir le bug.</p>
<p>Pour les autres langages, je ne sais pas.</p>
<p>Au passage, l'utilisation de volatile pour contourner le bug me semble être un hack sale qui impacte beaucoup les performance. Il aurait mieux valu isoler l'instruction qui pose problème et faire un cast explicite uniquement sur cette instruction.</p>À propos du bug 53632 de PHP - SpaceFoxurn:md5:67218822aca22c22732ca1e616e078f22011-02-08T11:58:59+01:002011-02-08T12:03:26+01:00SpaceFox<p>La grande différence entre un langage comme PHP et un autre comme Java, c'est que PHP va essayer de convertir n'importe quel "2.2250738585072011e-308" en entrée en double (et donc planter) alors qu'un langage comme Java ne va planter que si cette entrée est réellement un double.<br />
Or il y a assez peu de doubles "exposés" en paramètres.</p>
<p>Ce qui n'enlève rien au fait qu'il est honteux qu'Oracle n'aie pas corrigé ce bug très très vite.</p>À propos du bug 53632 de PHP - mageekguyurn:md5:d00b98f07e9003d4a2ab5a1463a099362011-02-03T09:31:37+01:002011-02-03T09:37:27+01:00mageekguy<p>@<a href="http://blog.mageekbox.net/?post/2011/02/01/%C3%80-propos-du-bug-53632-de-PHP#c2700" rel="nofollow">Nicolas Laforêt</a> : Pour l'explication très technique, pleine de 0 et de 1 et d'instruction <code>gdb</code> , c'est <a href="http://www.exploringbinary.com/why-volatile-fixes-the-2-2250738585072011e-308-bug/" rel="nofollow">ici</a>.</p>
<p>Mais en résumé, l'utilisation du mot-clef <code>volatile </code>force la variable à être stockée dans un registre 64 bits à la lecture et l'écriture, et non plus dans dans un buffer de 80 bits, ce qui permet de contourner le problème.</p>
<p>Le problème d'arrondi à l'origine de la boucle infinie est en effet toujours présent, mais grâce au passage sur 64 bits rendu obligatoire par l'instruction <code>volatile</code>, il n'a plus d'impact.</p>À propos du bug 53632 de PHP - Nicolas Laforêturn:md5:55abaea750ddbeded2bd7240ed072b232011-02-03T08:27:36+01:002011-02-03T09:37:34+01:00Nicolas Laforêt<p>Vu que je n'y connais absolument rien en C (oui oui j'ai eu des cours il y a quelques années mais bon...) je suis étonné qu'un tel bug soit résolut en passant la variable en "volatile" ... mais pour ne pas rester ignorant, te serait-il possible d'expliquer en quoi la mettre en volatile solutionne le bug ?</p>À propos du bug 53632 de PHP - jeremyFreeAgenturn:md5:98768c3e4c7d6a990dec37e24d77796e2011-02-02T17:15:43+01:002011-02-02T17:27:53+01:00jeremyFreeAgent<p>Merci pour les infos ! Comme toujours c'est bien expliqué !</p>À propos du bug 53632 de PHP - Dorianurn:md5:af8c9d2721f6abfb7398c24cd69c32b82011-02-02T11:11:39+01:002011-02-02T14:18:34+01:00Dorian<p>Super article, comme d'hab ! Merci</p>À propos du bug 53632 de PHP - MathRobinurn:md5:386dcd54f07d12e3f40a231be5db1a402011-02-01T14:37:14+01:002011-02-01T14:43:21+01:00MathRobin<p>Merci d'avoir éclairci la question de ce bug. J'avais pas eu le temps de me renseigner, en cinq minutes, t'as tout expliqué d'un bout à l'autre. Montrant au passage que ce n'est pas PHP qui est en cause.<br />
PHP impacté, Java impacté, de très nombreux (si ce n'est la quasi totalité) des programmes en C ou C++ ayant utilisé GCC sont concernés... ça fait un peu bug de l'an 2000 quand même ça.</p>À propos du bug 53632 de PHP - Ericurn:md5:75e6129e3702be5aead9ec73300a4d9c2011-02-01T14:25:30+01:002011-02-01T14:32:02+01:00Eric<p>> Et encore plus évidemment, beaucoup de gens ont encore dit que, décidément, PHP était vraiment un langage de merde</p>
<p>Non ? Pas pour ça quand même !</p>