StringBuilding optimization bug since Java 7 update 4

Vladimir Kozlov vladimir.kozlov at
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?

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


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)
> "javap -c" output, with sourcecode containing "s=s+s"
>     Javac:
>     Eclipse:
> 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 ( administrator)

More information about the hotspot-compiler-dev mailing list