Grave bug encontrado em conversão de String->Double em PHP aparece na JVM

Um simples e novo bug foi recém descoberto em todas as versões do Java. Um double d = Double.parseDouble(“2.2250738585072012e-308”); (o menor double possível) entra em loop infinito, assim como no PHP.

Ou mesmo se você escrever um código java com double d = 2.2250738585072012e-308; o compilador vai utilizar o Double.parseDouble internamente, fazendo o compilador travar em loop infinito.

Isso obviamente afeta JRuby, Scala, Clojure, etc. Pode ser também um ataque a formuários web que recebem parâmetros e convertem diretamente para Double, o que sempre pareceu ser uma operação segura.

Mais informações:
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

Testei na JVM do Mac e o mesmo ocorre. O código “que ofende” :slight_smile: é esse aqui:
http://google.com/codesearch/p?hl=en#lM3pwaU8RUc/src/share/classes/sun/misc/FloatingDecimal.java&q=parseDouble&l=1476

Não há respostas da Oracle até o momento. Agradecimentos ao @rlucindo

Se colar essa linha no netbeans ele trava.

Mas eu não vi esse bug com o:

e ainda dá um valor direfente.

só agora que eu vi, tem o MIN_NORMAL, mas o valor é bem próximo, mas ainda não é esse.

Double.MIN_NORMAL = 2.2250738585072014E-308; Double.MIN_VALUE = 4.9E-324

O bug é só no parseDouble. Se você usa a constante diretamente não há chamada ao parseDouble.

[quote=Sergio Lopes]O bug é só no parseDouble. Se você usa a constante diretamente não há chamada ao parseDouble.
[/quote]

Mas os valores não são os mesmos.

Só próximos.

é um antes do Double.MIN_NORMAL, algo assim.

Faça algo como System.out.printf("%.20e", Double.MIN_NORMAL);

Mas qual valor ele representa exatamente não é relevante para o bug. A fragilidade é qualquer um que converta diretamente de uma String da web para double, esta sucetivel a isso. Exemplo Double.parseDouble(req.getParameter(“valor”));

O meu eclipse tbm deu deadlock, mas é só dar stop nos processos de compilação.

Travou o eclipse também.

Ops … melhor não fazerem no eclipse não …
tive que editar o código por fora (notepad) e remover a linha … pq não conseguia mais salvar pelo eclipse …

encheu um pouco o saco aqui … travou bem feio … rs.

Até mais,

Aqui o eclipse travou também… mas acredito que foi porque eu usei esta forma:

Try to compile this program; the compiler will hang:

class compilehang {
public static void main(String[] args) {
  double d = 2.2250738585072012e-308;
  System.out.println("Value: " + d);
 }
}

Entao fica preso na compilação… brincadeira legal para fazer com estagiário :twisted: :lol:

No php a coisa é mais feia entao pelo o cast ser automático?

mto louco o cara que descobriu isso… quem vai usar um double dessa forma hehe

kkkkkk

Ai sim fomos surpreendidos novamente.!

[quote=danilomunoz]Ops … melhor não fazerem no eclipse não …
tive que editar o código por fora (notepad) e remover a linha … pq não conseguia mais salvar pelo eclipse …

encheu um pouco o saco aqui … travou bem feio … rs.

Até mais,[/quote]

Tive que fazer isso também.

Cuidado.

show de bola esse bug.

Então #comofaz agora? toda vez que tiver uma entrada de um valor double do usuário vou ter que validar??

Quem tiver um tempo vago e der uma pesquisada tem uma série de bugs milenares no bugtrack da Sun.

Tem um do JDK Logging que, inverte o System.out e o System.err, e já está fazendo seu 8º aniversário: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4827381

drigo cuidado para não validar com parseDouble() kkkkk…

[quote=Paulo Silveira]Um simples e novo bug foi recém descoberto em todas as versões do Java. Um double d = Double.parseDouble(“2.2250738585072012e-308”); (o menor double possível) entra em loop infinito, assim como no PHP.
[/quote]

impressionante, mas pelo jeito esse bug já tinha sido reportado desde o final de 2009:

https://bugs.openjdk.java.net/show_bug.cgi?id=100119

acho que eles não tinham pensado nessa possibilidade que vc citou de alguém fazer ataque via formularios.

No PHP esse bug já foi corrigido nas versões 5.3.5 e 5.2.17:

http://www.php.net/archive/2011.php#id2011-01-06-1

Luiz

[quote=bobmoe]
impressionante, mas pelo jeito esse bug já tinha sido reportado desde o final de 2009:

https://bugs.openjdk.java.net/show_bug.cgi?id=100119

acho que eles não tinham pensado nessa possibilidade que vc citou de alguém fazer ataque via formularios.[/quote]

Bem observado Roberto! Acho que é interessante voce postar essa referencia la no post da noticia!