2011-02-04 5 views
7

Mi sono imbattuto in una situazione interessante. Un collega ha commesso alcune modifiche, che non sarebbero state compilate sulla mia macchina né dall'IDE (Eclipse) né da una riga di comando (Maven). Il problema si è manifestato nel processo di compilazione prendendo il 100% di CPU e solo uccidendo il processo sarebbe stato utile per fermarlo. Dopo alcune analisi, la causa del problema è stata individuata e risolta. Si è rivelato essere una linea "double d = 2.2250738585072012e-308" (senza punto e virgola alla fine) in una delle interfacce. Il seguente frammento lo duplica.La compilazione si blocca per una classe con campo double d = 2.2250738585072012e-308

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

Perché il compilatore si blocca? Un caso limite linguistico?

+0

A proposito: non importa se c'è un punto e virgola dopo il numero o meno. È il valore numerico del letterale 'double' che è il problema. –

+0

Lo stesso accade in Intellij IDEA. Deve essere un bug dell'SDK. –

+4

Googling per 2.2250738585072012e-308 ti avrebbe dato molte risposte. – ordnungswidrig

risposta

16

Si tratta di un bug nel algoritmo di conversione String-a-doppia della JVM: http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

È possibile ottenere lo stesso appendere, se si tenta di analizzare quella stringa in fase di esecuzione. Il compilatore si blocca perché usa lo stesso codice (dopotutto è un programma Java).

Aggiornamento: la questione ha ora una CVE identificatore (CVE-2010-4476) e a patch (per Oracle JVM, funziona anche su OpenJDK).

Secondo the patch, tutto si riduce a un errore di off-by-one.

+4

È persino un problema di sicurezza (negazione del server) quando un servizio accetta JSON. L'invio di un documento JSON come: {x: 2.2250738585072012e-308} a una risorsa Web che si aspetta che un documento JSON si blocchi durante l'analisi. – ordnungswidrig

+3

Questo collega è un tipo davvero divertente ... Bel modo per uccidere una build. –

+2

@Andreas_D: oh sì, nel caso in cui non fosse ovvio: è probabile che il collaboratore abbia * non * verificato accidentalmente quel numero. –

5

Questo è un problema noto che era nelle notizie un paio di giorni fa. Maggiori informazioni here.

3

Questo è un bug aperto da oltre 10 anni. Cattivo sole

Il fatto che i sistemi Java non siano stati attaccati e morti in massa dimostra che ci sono davvero poche persone cattive sulla terra.

+1

Immagina se accadesse in un reattore nucleare: D Ma allora, non useresti Java per questo. Forse per il controllo sistemi. –

Problemi correlati