Skąd takie pytanie?
Otóż jest pewien wartość sprawiająca Javie kłopoty.
Jaki jest Twoim zdaniem efekt uruchomienia programu:
package pl.matt.fne;
public class Main {
public static void main(String[] args) {
double d = Double.valueOf("22.250738585072012e-309");
System.out.println(d);
}
}
No więc niestety. Program uruchamia się bez końca. Po prostu się zapętla. Także ulubionym numerem prawdziwego hakera jest ostatnio:
22.250738585072012e-309.
Próbę wytłumaczenia tego fenomenu można znaleźć pod tym adresem. Ja niestety wymiękłem podczas analizy klasy FloatingDecimal.
22.250738585072012e-309 to bardzo przebiegła liczba.
Spróbujmy skompilować program:
package pl.matt.fne;
public class Main {
public static void main(String[] args) {
double d = 22.250738585072012e-309;
System.out.println(d == 12);
}
}
Znowu niespodzianka.
javac też się zawiesza.
Czy ta ciekawostka może być groźna.
Ano może.
Wyobraźmy sobie aplikację, która przyjmuje podaną użytkownika liczbę niecałkowitą i konwertuje ją do zmiennej typu double.
Odpowiednio spreparowane żądanie do takiej aplikacji może na zawsze zająć jej wątek. Atak DoS jak się patrzy.
Spróbuję w przyszłym tygodniu przygotować przykład ilustrujący ten scenariusz.
Tymczasem Oracle wypuścił patcha mającego wyeliminować powyższe niedogodności.
Działa u was?
Ja jeszcze nie instalowałem.