2011-02-04 3 views
7

Me he encontrado con una situación interesante. Un compañero de trabajo realizó algunos cambios, que no se compilan en mi máquina ni desde el IDE (Eclipse) ni desde una línea de comandos (Maven). El problema manifestado en el proceso de compilación tomando 100% de CPU y solo matando el proceso ayudaría a detenerlo. Después de algunos análisis, se localizó y resolvió la causa del problema. Resultó ser una línea "double d = 2.2250738585072012e-308" (sin punto y coma al final) en una de las interfaces. El siguiente recorte lo duplica.Compilación se cuelga para una clase con campo doble d = 2.2250738585072012e-308

public class WeirdCompilationIssue { 
    double d = 2.2250738585072012e-308 
} 

¿Por qué el compilador se bloquea? ¿Un caso de borde de lenguaje?

+0

Por cierto: no debería importar si hay un punto y coma después del número o no. El problema es el valor numérico del literal "doble". –

+0

Lo mismo sucede en Intellij IDEA. Debe ser un error de SDK. –

+4

googlear para 2.2250738585072012e-308 le habría dado un montón de respuestas. – ordnungswidrig

Respuesta

16

Es un error en el algoritmo de conversión de cadena a doble de la JVM: http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

Usted puede obtener el mismo colgar si se intenta analizar esa cadena en tiempo de ejecución. El compilador se cuelga porque usa el mismo código (después de todo es un programa Java).

Actualización: el tema ahora tiene un identificador CVE (CVE-2010-4476) y a patch (para Oracle JVM, también trabaja en OpenJDK).

De acuerdo con the patch todo se reduce a un error de uno por uno.

+4

Incluso es un problema de seguridad (denegación de servidor) cuando un servicio acepta JSON. Enviar un documento json como: {x: 2.2250738585072012e-308} a un recurso web que está esperando que se cuelgue un documento JSON en el análisis. – ordnungswidrig

+3

Este compañero de trabajo es un tipo realmente divertido ... Una buena manera de matar una construcción. –

+2

@Andreas_D: oh sí, en caso de que no fuera obvio: es probable que su compañero de trabajo * * no haya registrado accidentalmente ese número. –

5

Este es un problema conocido que apareció en las noticias hace un par de días. Más información here.

3

Este es un error abierto desde hace más de 10 años. Bad Sun.

El hecho de que los sistemas Java no hayan sido atacados y muertos en masa demuestra que realmente hay muy pocas personas traviesas en la tierra.

+1

Imagínese si sucediera en un reactor nuclear: D Pero entonces, no usaría Java para eso. Quizás para el control sistemas. –

Cuestiones relacionadas