2011-02-04 8 views
7

Natknąłem się na interesującą sytuację. Współpracownik popełnił pewne zmiany, które nie zostałyby skompilowane na moim komputerze ani z IDE (Eclipse) ani z wiersza poleceń (Maven). Problem ujawnił się w procesie kompilacji, biorąc 100% procesora i tylko zabicie procesu pomogłoby go zatrzymać. Po przeprowadzeniu analizy znaleziono przyczynę problemu i rozwiązano go. Okazało się, że wiersz "double d = 2.2250738585072012e-308" (bez średnika na końcu) w jednym z interfejsów. Poniższe snipped duplikuje go.Kompilacja wisi dla klasy z polem podwójnym d = 2.2250738585072012e-308

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

Dlaczego kompilator się zawiesił? Przypadek krawędzi językowej?

+0

Przy okazji: nie powinno mieć znaczenia, czy po numerze występuje średnik, czy nie. Jest to wartość numeryczna "podwójnego" dosłowności. –

+0

To samo dzieje się w Intelli IDEA. Musi to być błąd SDK. –

+4

Googling dla 2.2250738585072012e-308 dałoby ci mnóstwo odpowiedzi. – ordnungswidrig

Odpowiedz

16

Jest to błąd w algorytmie konwersji String-do-double JVM: http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

Można uzyskać taki sam powiesić, jeśli starają się przeanalizować ten ciąg w czasie wykonywania. Kompilator się zawiesza, ponieważ używa tego samego kodu (w końcu jest to program Java).

Aktualizacja: kwestia ma teraz CVE identyfikator (CVE-2010-4476) i a patch (Oracle JVMs, działa również na OpenJDK).

Zgodnie z the patch wszystko sprowadza się do błędu "jeden po drugim".

+4

To nawet problem bezpieczeństwa (odmowa serwera), gdy usługa akceptuje JSON. Przesyłanie dokumentu json, jak: {x: 2.2250738585072012e-308} do zasobu sieciowego, który oczekuje, że dokument JSON będzie zawieszony podczas analizy. – ordnungswidrig

+3

Ten współpracownik to naprawdę zabawny facet ... Dobry sposób na zabicie budowli. –

+2

@Andreas_D: o tak, na wypadek, gdyby nie było to oczywiste: prawdopodobnie jesteś współpracownikiem * nie * przypadkowo sprawdź ten numer. –

5

Jest to znany problem, który pojawił się w wiadomościach kilka dni temu. Więcej informacji: here.

3

To jest otwarty błąd od ponad 10 lat. Złe Słońce.

Fakt, że systemy Java nie zostały zaatakowane i umarli masowo, dowodzi, że na ziemi jest naprawdę bardzo mało ludzi niegrzecznych.

+1

Wyobraź sobie, że to się stało w reaktorze jądrowym: D Ale wtedy nie używałbyś do tego Java. systemy. –