StringBuilding optimization bug since Java 7 update 4

Vladimir Kozlov vladimir.kozlov at oracle.com
Fri Jun 22 10:06:46 PDT 2012


Thank you for finding this issue, I filed bug report:

7179138: Incorrect result with String concatenation optimization

Few questions:

Can we add your tests to Hotspot VM regression tests?

http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/1c280e5b8d31/test/compiler/

What should we put into the test's Copyright line?
And what reference you want in test's @author line?

Thanks,
Vladimir

Skip Balk wrote:
> Dear HotSpot developers,
>  
>  
> This is the first time I post anything on any mailinglist, so please 
> forgive me if my message is not quite up to the standards you are used to.
>  
> Last week, I encountered a bug in simple String concatenation, like:
>  
> String s = "test";
>     s = s+s;
>     s = s+s;
>     s = s+s;
>  
> yielding the string: "nullnulltesttest" instead of 
> "testtesttesttesttesttesttesttest". The first Java version that seems to 
> suffer from this bug is Java 7u4, and is confirmed to occur in 7u5, 
> 7u6(rc). It has been further reproduced on 32bit, 64bit, clientvm and 
> servervm.
>  
> After a few thousand (interpreted) runs of this code, it starts to give 
> these incorrect results, leading me to assume that a HotSpot 
> optimisation is the root cause of this problem, which is backed by the 
> fact that when running the java process with the -Xint argument, the bug 
> does not occur.
>  
> Unfortunately, today I discovered that with my trivial sourcecode, the 
> issue only occured with the Eclipse compiler. The Javac output seemed to 
> be 'friendly' to HotSpot.
>  
> Upon further investigation, it turned out that "s=s+s" was compiled to 
> different bytecode by Javac and Eclipse:
>     Eclipse: s = new StringBuilder(String.valueOf(s)).append(s).toString();
>     Javac:   s = new StringBuilder().append(s).append(s).toString();
> When writing the version Eclipse produces in Java sourcecode, the javac 
> compiler also produced the bytecode that made HotSpot trip.
>  
> Without further ado: here are the full code-dumps (both for eclipse and 
> javac)
>     
> http://riven8192.blogspot.com/2012/06/hotspot-bug-in-java-7u4-7u5-7u6rc-with.html
>  
> "javap -c" output, with sourcecode containing "s=s+s"
>     Javac:   http://pastebin.com/raw.php?i=pC3kRC6c
>     Eclipse: http://pastebin.com/raw.php?i=Pbj0fyZ8
>  
> Console output:
>     Java Version: 23.0-b21
>     Failed at iteration: 11983
>     Length mismatch: 16 <> 32
>     Expected: "testtesttesttesttesttesttesttest"
>     Actual:   "nullnulltesttest"
>  
> Last but not least, this bug seems to be triggered by the 
> empty-for-loop, which leads me to believe this is a case of too 
> aggresive dead code removal. I hope you can
>  
>  
> With kind regards,
>     Riven (http://www.java-gaming.org/ administrator)


More information about the hotspot-compiler-dev mailing list