RFR: JDK-8243047: javac may crash when processing exists in class initializers

Jan Lahoda jan.lahoda at oracle.com
Fri Apr 17 19:47:22 UTC 2020


Oops, sorry for that! Fixed here:
http://cr.openjdk.java.net/~jlahoda/8243047/webrev.01/

A diff from previous:
http://cr.openjdk.java.net/~jlahoda/8243047/webrev.delta.00.01/

Thanks,
     Jan

On 17. 04. 20 19:41, Vicente Romero wrote:
> Hi Jan,
> 
> The fix looks good, there seems to be an issue in the combo test though 
> at enum: Block, there is no difference in the arguments of STATIC and 
> INSTANCE and in the arguments of STATIC_INITIALIZER and INITIALIZER,
> 
> Thanks,
> Vicente
> 
> On 4/17/20 5:25 AM, Jan Lahoda wrote:
>> Hi,
>>
>> For code like:
>> ---
>> public class ExitInInitializer {
>>     {return;}
>> }
>> ---
>>
>> If javac is invoked like:
>> $ javac -XDshould-stop.at=FLOW -XDdev ExitInInitializer.java
>>
>> javac eventually crashes with:
>> java.lang.AssertionError
>>         at 
>> jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:155)
>>         at 
>> jdk.compiler/com.sun.tools.javac.util.Assert.check(Assert.java:46)
>>         at 
>> jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitMethodDef(Flow.java:558) 
>>
>>
>> The reason is that the the (invalid) "return" in the intializer is 
>> added to pendingExits, but not removed as the end of the initializer, 
>> and when analyzing method, javac checks pendingExits are empty.
>>
>> The proposed solution is to clear pendingExits at the end of 
>> initializers. The asserts that an error had to be reported for such 
>> exits is preserved, so there shouldn't be a danger of accidentally 
>> letting incorrect compilation pass.
>>
>> Webrev:
>> http://cr.openjdk.java.net/~jlahoda/8243047/webrev.00/
>>
>> JBS: https://bugs.openjdk.java.net/browse/JDK-8243047
>>
>> How does this look?
>>
>> Thanks,
>>     Jan
> 


More information about the compiler-dev mailing list