Compilation hangs for a class with field double d

2019-01-27 22:30发布

I have come across an interesting situation. A coworker committed some changes, which would not compile on my machine neither from the IDE (Eclipse) nor from a command line (Maven). The problem manifested in the compilation process taking 100% CPU and only killing the process would help to stop it. After some analysis the cause of the problem was located and resolved. It turned out be a line "double d = 2.2250738585072012e-308" (without semicolon at the end) in one of the interfaces. The following snipped duplicates it.

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

Why would compiler hang? A language edge case?

4条回答
贼婆χ
2楼-- · 2019-01-27 22:55

This is an open bug for over 10 years. Bad Sun.

The fact that Java systems haven't been attacked and dead in masses proves that there are really very few naughty people on the earth.

查看更多
看我几分像从前
3楼-- · 2019-01-27 22:59

Oracle has released a hot fix which can be found here:

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

The hotfix will work for java 1.4, 1.5, and 1.6.

查看更多
beautiful°
4楼-- · 2019-01-27 23:12

This is a known issue which was in news a couple of days back. More info here.

查看更多
趁早两清
5楼-- · 2019-01-27 23:19

It's a bug in the String-to-double conversion algorithm of the JVM: http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

You can get the same hang if you try to parse that string at runtime. The compiler hangs because it uses the same code (it's a Java program after all).

Update: the issue now has a CVE identifier (CVE-2010-4476) and a patch (for Oracle JVMs, also works on OpenJDK).

According to the patch it all boils down to an off-by-one error.

查看更多
登录 后发表回答