Code review request: 6973831 NPE when printing stack trace of OOME

Rémi Forax forax at univ-mlv.fr
Wed Aug 11 21:03:46 UTC 2010


Le 11/08/2010 22:53, Mandy Chung a écrit :
>  On 08/11/10 12:35, Brian Goetz wrote:
>> This code has thread-safety issues.  There is no happens-before 
>> between the writes to suppressedExceptions (and its referenced state) 
>> and the places where it is iterated (e.g., line 576).
>>
>> You could plug this hole by replacing the idiom at line 576 (and 
>> similar) with
>>    for (Throwable se : getSuppressedExceptions()).
>>
>
> Good point.  I fixed getSuppressedExceptions() be a synchronized 
> method but missed the unsynchronized reads.
>
>> This would be needed for all unsynchronized reads of 
>> suppressedException.  You could get away without it at the null check 
>> if you really were trying to squeeze some performance out and you 
>> didn't mind occasionally missing writes from other threads.
>>
>>
>
> The updated webrev is at:
>    http://cr.openjdk.java.net/~mchung/6973831/webrev.01/
>
> I leave the unsynchronized read in the readObject() method as the 
> Throwable object is still being deserialized and the 
> suppressedExceptions is going to be replaced with a new list.
>
> Thanks
> Mandy

Brian, Mandy,
It seems this is not the sole thread-safety issue,
access to fields 'cause' or 'stackTrace' aren't thread safe too and 
detailMessage is not final.

Rémi


>
>> On Aug 11, 2010, at 3:09 PM, Mandy Chung wrote:
>>
>>> Fix for 6973831: NPE when printing stack trace of OOME
>>>
>>> Webrev at:
>>>    http://cr.openjdk.java.net/~mchung/6973831/webrev.00/
>>>
>>> The VM preallocates OutOfMemoryError objects to improve OOM 
>>> diagnosability. The constructor is not invoked since the OOME object 
>>> allocation is done at VM initialization time and thus the new 
>>> suppressedExceptions field is null which causes NPE when 
>>> Throwable.printStackTrace() method is called on the VM preallocated 
>>> OOM object.
>>>
>>> The fix is to initialize the suppressedExceptions field to null 
>>> instead of Collections.emptyList().  An alternative could be to 
>>> initialize the suppressedException field in the VM after VM 
>>> initialization is finished.  It doesn't handle the case when any new 
>>> field initialized to be non-null is added in the OOM object in the 
>>> future and it would require a VM synchronized change.  The libraries 
>>> fix is simpler and preferred.
>>>
>>> Thanks
>>> Mandy
>




More information about the core-libs-dev mailing list