Компиляция зависает для класса с полем double d = 2.2250738585072012e-308 - PullRequest
7 голосов
/ 04 февраля 2011

Я столкнулся с интересной ситуацией.Сотрудник внес некоторые изменения, которые не будут компилироваться на моей машине ни из IDE (Eclipse), ни из командной строки (Maven).Проблема, проявившаяся в процессе компиляции, когда процессор загружен на 100% и только уничтожение процесса, поможет остановить его.После некоторого анализа причина проблемы была найдена и устранена.В одном из интерфейсов оказалась строка «double d = 2.2250738585072012e-308» (без точки с запятой).Следующий фрагмент кода дублирует его.

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

Почему зависает компилятор?Языковой край?

Ответы [ 4 ]

16 голосов
/ 04 февраля 2011

Это ошибка в алгоритме преобразования строки в двойной код JVM: http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

Вы можете получить такое же зависание, если попытаетесь проанализировать эту строку во время выполнения.Компилятор зависает, потому что он использует тот же код (в конце концов, это Java-программа).

Обновление: проблема теперь имеет идентификатор CVE ( CVE-2010-4476 ) и патч (для Oracle JVM также работает на OpenJDK).

Согласно патчу все сводится кошибка "один на один".

5 голосов
/ 04 февраля 2011

Это известная проблема, которая была в новостях пару дней назад.Подробнее здесь .

3 голосов
/ 05 февраля 2011

Это открытая ошибка более 10 лет.Плохое Солнце.

Тот факт, что системы Java не были атакованы и мёртвыми в массах, доказывает, что на земле действительно очень мало озорных людей.

1 голос
/ 10 февраля 2011

Oracle выпустила исправление, которое можно найти здесь:

http://www.oracle.com/technetwork/java/javase/fpupdater-tool-readme-305936.html

Исправление будет работать для Java 1.4, 1.5 и 1.6.

...