对于具有字段double d = 2.2250738585072012e-308的类,编译挂起

我遇到了一个有趣的情况。 同事提交了一些更改,这些更改无法在我的计算机上从IDE(Eclipse)或命令行(Maven)进行编译。 在编译过程中出现的问题表现在占用100%CPU并且只杀死进程将有助于阻止它。 经过一些分析后,找到并解决了问题的原因。 事实certificate,在其中一个接口中有一条“double d = 2.2250738585072012e-308”(最后没有分号)。 以下剪辑重复了它。

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

为什么编译器会挂起? 一个语言边缘案例?

这是JVM的String-to-double转换算法中的一个错误: http : //www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

如果尝试在运行时解析该字符串,则可以获得相同的挂起。 编译器挂起,因为它使用相同的代码(毕竟它是一个Java程序)。

更新:该问题现在具有CVE标识符( CVE-2010-4476 )和补丁 (对于Oracle JVM,也适用于OpenJDK)。

根据补丁,这一切归结为一个一个错误。

这是一个众所周知的问题,几天前就出现在新闻中。 更多信息在这里 。

这是一个开放的bug超过10年。 坏太阳

Java系统没有遭到大规模攻击和死亡的事实certificate,地球上真的很少有顽皮的人。

Oracle发布了一个热修复程序,可以在这里找到:

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

此修补程序适用于java 1.4,1.5和1.6。