Serious bug: "finally" block is run whenever "continue" is reached
Anthony Vanelverdinghe
anthony.vanelverdinghe at gmail.com
Sun Mar 8 14:22:15 UTC 2015
Hi Tal
This might already have been solved in 9, and backported to 8u60, with
bug JDK-8067139 [1]: Finally blocks inlined incorrectly
Kind regards,
Anthony
[1] https://bugs.openjdk.java.net/browse/JDK-8067139
On 8/03/2015 14:55, Tal Liron wrote:
> This was very hard to discover, but it is real and easy to reproduce.
> Try running this program:
>
> var finalies = 1
> var line = 'TEST THIS LINE'
> try {
> while ('' !== (line = line.substring(0, line.length - 1))) {
> if (line.length % 2 == 0) {
> continue
> }
> java.lang.System.out.println(line)
> }
> }
> catch (x) {
> java.lang.System.out.println(x)
> }
> finally {
> java.lang.System.out.println('Finalies ' + (finalies++))
> }
>
> If you run this code, you'll see that the "finally" block is run every
> time "continue" is reached, and then the while loop continues after
> the "finally" block is run. Of course, the "finally" block should only
> be called once in this example, and the while loop should not
> continue, and this broken behavior can lead to serious problems.
>
> (I added the "catch" block only to make sure that exceptions are not
> thrown, and indeed they are not. Sorry about the silly functionality
> of the program, but it's the result of trying to wrap my head around
> what was going on...)
>
> Or maybe I'm crazy and am missing something trivial? The same code
> runs in Rhino without this problem.
>
> The bug appears in the 8u40 release. :(
>
> -Tal
>
>
More information about the nashorn-dev
mailing list