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

01e*_*1es 7 java compilation javac

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

public class WeirdCompilationIssue {
   double d = 2.2250738585072012e-308
}
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 16

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

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

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

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

  • 当服务接受JSON时,它甚至是安全问题(拒绝服务器).将类似于:{x:2.2250738585072012e-308}的json文档发送到期望JSON文档的Web资源将在解析时挂起. (4认同)
  • 这位同事是一个非常有趣的家伙...杀死一个版本的好方法. (3认同)
  • @Andreas_D:哦,是的,如果不是很明显:你很可能同事没有*不小心检查那个号码. (2认同)

San*_*rma 5

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