RFR: 8238735 NPE compiling lambda expression within conditional expression

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Jun 17 09:54:36 UTC 2020

The patch looks less invasive/more pragmatic.

Looks good.


On 17/06/2020 08:37, Adam Sotona wrote:
> Hi,
> I've spent some time deep debugging of the javac NPE caused by lambda 
> recovery process and here is an alternate patch (in contrast to the 
> previous proposed patch skipping the recovery for the case).
> webrev: http://cr.openjdk.java.net/~asotona/8238735/webrev.01/
> JBS: https://bugs.openjdk.java.net/browse/JDK-8238735
> This patch runs the recovery round in case of invalid 
> FunctionDescriptor, however to avoid return of result containing 
> Type.recoveryType (which has no tsym and so causing the NPE and 
> compiler crash) the final returned type is saved error type from the 
> first round of visitLambda. The patch also contains new test for this 
> NPE case.
> The patch passes all Tier1, Tier2 and Tier 3 tests.
> Thanks for the review,
> Adam
>> On 20 May 2020, at 17:25, Adam Sotona <adam.sotona at oracle.com 
>> <mailto:adam.sotona at oracle.com>> wrote:
>> Hi,
>> in this situation the second "recovery" round completely messes the 
>> results.
>> In the first run the result is correctly filled: result = that.type = 
>> types.createErrorType(pt()); and suppose to be returned,
>> however then another recovery is triggered and it  re-enters the 
>> whole visitLambda with totally messed initial values.
>> As a result the second evaluation returns Type.recoveryType constant, 
>> which I expect should be never returned and with no indication that 
>> the evaluation failed.
>> Type.recoveryType has missing .tsym field and that is causing NPE.
>> My original idea was to simply avoid NPE by appropriate check, 
>> however I do not see any such similar code across javac.
>> I see many direct calls of Type.tsymin the code however no NPE 
>> protection anywhere. How it is guaranteed that instances of JCNoType 
>> (with null tsym) will never reach the code?
>> Then I tried to fix it by correcting the result of the recovery 
>> round, however that seems to be very complex as the initial values of 
>> the recovery may vary a lot and detect the "messed" situation and 
>> find what suppose to be returned in that case is very complex.
>> Then I realized that this is the situation where recovery should not 
>> happen as lambda without its FunctionDescriptor can hardly continue 
>> in compilation as it does not know anything about the expected content.
>> The two error messages I had to remove from the test after the fix 
>> didn't make any sense to me. From all aspect there are two errors in 
>> the two lambdas, however second round of recovery listed two more 
>> nonsense errors: "compiler.err.cant.resolve.location: kindname.class, 
>> NonExistentClass, , , (compiler.misc.location: kindname.class, 
>> TargetType43, null)"
>> BTW: Impact of the NPE is not just when used within conditional 
>> expression (as described in the 8238735), however it is silently 
>> killing javac with NPE anywhere you try to cast lambda expression 
>> that fails to lookup its FunctionDescriptor. For example just try to 
>> compile: class A {boolean b = (boolean)(() -> false);}
>> Thanks,
>> Adam
>>> On 20 May 2020, at 10:19, Adam Sotona <adam.sotona at oracle.com 
>>> <mailto:adam.sotona at oracle.com>> wrote:
>>> Hi,
>>> I would like to add results from Corpus compilation regression 
>>> testing: the patch caused no regression in compilation of all Corpus 
>>> sources :)
>>> Thanks for review,
>>> Adam
>>>> On 18 May 2020, at 17:47, Adam Sotona <adam.sotona at oracle.com 
>>>> <mailto:adam.sotona at oracle.com>> wrote:
>>>> Hi,
>>>> I would like to ask for review of the patch fixing NPE while 
>>>> compiling lambda expression within conditional expression.
>>>> The fix removes obsolete recovery cycle in 
>>>> com.sun.tools.javac.comp.Attr.visitLambda method when 
>>>> Types.FunctionDescriptorLookupError happens and it adds new test.
>>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8238735
>>>> webrev: http://cr.openjdk.java.net/~asotona/8238735/webrev.00/
>>>> Mach 5 build with the patch passes all Tier1, Tier2 and Tier3 tests.
>>>> Thank you,
>>>> Adam
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20200617/a8694f44/attachment-0001.htm>

More information about the compiler-dev mailing list