[15] RFR: 8248476: No helpful NullPointerException message after calling fillInStackTrace
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Tue Jul 14 20:27:05 UTC 2020
On 7/14/20 4:17 PM, Mandy Chung wrote:
> fillInStackTrace and setStackTrace replace the stack trace of a NPE
> instance. Therefore I think both should behave consistently for any
> NPE instances with and without an explicit message.
>
> For webrev.06/webrev.07, this would behave as if NPE was created with
> an extended message which cannot be altered once constructed. I
> expect that it'd be rare to see NPE instance thrown by VM (not
> explicitly constructed) but whose stack trace is replaced. So I'm
> fine with this approach.
>
> webrev.06 is okay while I think checking Throwable::backtrace != null
> is clearer as I suggested.
I like that version 06 isolates knowledge to NullPointerException.java
and doesn't have to know what the expected value of backtrace is in the
super class. I maintain my vote for 06.
Thanks, I was trying to understand the fillInStackTrace vs.
setStackTrace issue, and your description makes sense to me.
Coleen
>
> Mandy
>
> On 7/14/20 12:55 PM, coleen.phillimore at oracle.com wrote:
>>
>> Goetz and all,
>>
>> I have to admit, the version with the counter 06 is more intuitive to
>> me. It would be even better if it was a boolean. I don't think an
>> extra 32 bits in an NPE Throwable matters considering the backtrace
>> is a lot bigger. The NPE Throwable in general shouldn't be a long
>> lived object, and there shouldn't be thousands of them.
>>
>> There seemed to be disagreement on the issue of the message not
>> matching the stack trace if the code calls setStackTrace(). It
>> doesn't seem like it should be the same at all to fillInStackTrace()
>> to me, but this latest patch maintains the status quo. If you want
>> to explore this further, I think you should file a separate RFE, and
>> fix the reported bug with this patch.
>>
>> So if I get a vote, I'd pick 06.
>>
>> Thanks,
>> Coleen
>>
>> On 7/14/20 9:48 AM, Lindenmaier, Goetz wrote:
>>> Hi,
>>>
>>> Yes, Coleen, you are right. We must preserve the lazy
>>> computation, and also reduce overhead on discarded
>>> exceptions.
>>>
>>> And yes, we can do it with a counter:
>>> http://cr.openjdk.java.net/~goetz/wr20/8248476-NPE_fillInStackTrace-jdk15/06/
>>>
>>> but I would prefer placeholder strings:
>>> http://cr.openjdk.java.net/~goetz/wr20/8248476-NPE_fillInStackTrace-jdk15/07/
>>>
>>> This way we need only one new field.
>>>
>>> (I need two placeholders, because the getExtendedNPEMessage0()
>>> sometimes returns null. If I write null into the extendedMessage field,
>>> fillInStackTrace sets it to mustComputeExtendedNPEMessage a second
>>> time.)
>>>
>>> With webrev 07 the overhead on discarded exceptions is basically the
>>> same as with webrev 05: one additional field, one assignment in
>>> fillInStackTrace().
>>>
>>> What do you think?
>>>
>>> Best regards,
>>> Goetz.
>>>
>>>
>>>
>>>
>>>> -----Original Message-----
>>>> From: David Holmes <david.holmes at oracle.com>
>>>> Sent: Tuesday, July 14, 2020 1:55 PM
>>>> To: Lindenmaier, Goetz <goetz.lindenmaier at sap.com>;
>>>> 'forax at univ-mlv.fr'
>>>> <forax at univ-mlv.fr>; Alan Bateman <Alan.Bateman at oracle.com>
>>>> Cc: Christoph Dreis <christoph.dreis at freenet.de>; hotspot-runtime-dev
>>>> <hotspot-runtime-dev at openjdk.java.net>
>>>> Subject: Re: [15] RFR: 8248476: No helpful NullPointerException
>>>> message
>>>> after calling fillInStackTrace
>>>>
>>>> Correction ...
>>>>
>>>> On 14/07/2020 12:11 pm, David Holmes wrote:
>>>>> Hi Goetz,
>>>>>
>>>>> Okay ... if I understand your position correctly you are looking
>>>>> at this
>>>>> as if the extended message is created at the time the NPE is
>>>>> thrown, and
>>>>> it is an implementation detail that we actually determine it
>>>>> lazily. If
>>>>> it were eagerly determined then neither fillInstacktrace() nor
>>>>> setStackTrace() would make any difference to the message - just as
>>>>> with
>>>>> any other exception message.
>>>>>
>>>>> However, the lazy determination of the message causes a problem with
>>>>> fillInStackTrace() because that call will destroy the original
>>>>> backtrace
>>>>> needed to produce the original message, and create an incorrect
>>>>> message.
>>>>> setStackTrace() does not have a similar problem because, simply by
>>>>> the
>>>>> way the current implementation works it doesn't touch the original
>>>>> backtrace.
>>>>>
>>>>> So you are proposing to only fix the bug that is evident in
>>>>> relation to
>>>>> fillInStackTrace() by no longer evaluating the extended message if
>>>>> fillInStackTrace() is called after the NPE was constructed.
>>>>>
>>>>> But in doing so you break the illusion that the extended message acts
>>>>> as-if determined at construction time, because you now effectively
>>>>> clear
>>>>> it when fillInStackTrace is called.
>>>>>
>>>>> My position was that if fillInStackTrace can be seen to clear it,
>>>>> then
>>>>> setStackTrace (which is logically somewhat equivalent) should also be
>>>>> seen to clear it.
>>>>>
>>>>> Alternatively, add a new field to NPE to cache the extended error
>>>>> message, and explicitly evaluate the message if fillInStackTrace() is
>>>>> called. That will continue the illusion that the extended message was
>>>>> actually set at construction time. No changes needed to
>>>>> setStackTrace()
>>>>> as we can still lazily compute the extended message.
>>>>>
>>>>> Something like:
>>>>>
>>>>> private String extendedMessage;
>>>>>
>>>>> public synchronized Throwable fillInStackTrace() {
>>>>> if (extendedMessage == NULL) {
>>>>> extendedMessage = getExtendedNPEMessage();
>>>>> }
>>>>> return super.fillInStackTrace();
>>>>> }
>>>> Coleen pointed out to me that we can't do it like this because we need
>>>> the initial fillInStacktrace to be fast and we want the extended
>>>> message
>>>> computed lazily. So it will still need a counter so we only do this on
>>>> the second call.
>>>>
>>>>
>>>> private String extendedMessage;
>>>> private int fillInCount;
>>>>
>>>> public synchronized Throwable fillInStackTrace() {
>>>> if (extendedMessage == NULL && (fillInCount++ == 1)) {
>>>> extendedMessage = getExtendedNPEMessage();
>>>> }
>>>> return super.fillInStackTrace();
>>>> }
>>>>
>>>> or something to that effect.
>>>>
>>>> David
>>>> -----
>>>>
>>>>> public String getMessage() {
>>>>> String message = super.getMessage();
>>>>> synchronized(this) {
>>>>> if (message == null) {
>>>>> // This NPE should have an extended message.
>>>>> if (extendedMessage == NULL) {
>>>>> extendedMessage = getExtendedNPEMessage();
>>>>> }
>>>>> message = extendedMessage;
>>>>> }
>>>>> }
>>>>> return message;
>>>>> }
>>>>>
>>>>> Cheers,
>>>>> David
>>>>>
>>>>> On 14/07/2020 12:48 am, Lindenmaier, Goetz wrote:
>>>>>> Hi David,
>>>>>>
>>>>>>> Your extended message is only computed when there is no original
>>>>>>> message.
>>>>>> Hmm. I would say the extended message is only computed when
>>>>>> The NPE was raised by the runtime. It happens to never have a
>>>>>> message so far in these cases.
>>>>>> But this is two views to the same thing
>>>>>>
>>>>>>> You're concerned about this scenario:
>>>>>>>
>>>>>>> catch (NullPointerException npe) {
>>>>>>> String msg1 = npe.getMessage(); // gets extends NPE message
>>>>>>> npe.setStackTrace(...);
>>>>>>> String msg2 = npe.getMessage(); // gets null
>>>>>>> }
>>>>>>>
>>>>>>> While I find it hard to imagine anyone doing this
>>>>>> Well, all the scenario are quite artificial:
>>>>>> - why would you call fillInStackTrace on an exception thrown
>>>>>> by the VM?
>>>>>> - why would you call setStackTrace at all?
>>>>>>> you can easily have
>>>>>>> specified that the extended message is only available with the
>>>>>>> original
>>>>>>> stacktrace, hence after a second call to fillInStackTrace, or a
>>>>>>> call to
>>>>>>> setStackTrace, then the message reverts to being empty.
>>>>>> The message is not meant to be a special thing that behaves
>>>>>> different
>>>>>> from other messages. Like sometime be available, sometime not.
>>>>>> It ended up being different through requirements during the
>>>>>> review.
>>>>>>
>>>>>>> To me that makes
>>>>>>> far more sense than having msg2 continue to report the extended
>>>>>>> info
>>>> for
>>>>>>> the original stacktrace when it now has a new stacktrace.
>>>>>>>
>>>>>>> I'm really not seeing why calling fillInstackTrace() a second time
>>>>>>> should be treated any differently to calling setStackTrace(). They
>>>>>>> should be handled consistently IMO.
>>>>>> But then you treat setStackTrace() differently from setStackTrace()
>>>>>> with other exceptions.
>>>>>> The reason to treat fillInStackTrace differently is that we lost
>>>>>> information
>>>>>> needed to compute it. This is not the case with setStackTrace().
>>>>>>
>>>>>> A different solution, the one I would have proposed if I had not
>>>>>> considered previous comments from reviews, would be to just
>>>>>> compute the message in the runtime in the call of fillInStackTrace
>>>>>> before the old stack trace is lost and assign it to the message
>>>>>> field.
>>>>>> This way it would behave similar to all other exceptions. The
>>>>>> message
>>>>>> would just be there ... just that it's computed lazily.
>>>>>> The cost of the algorithm wouldn't harm that much as other costly
>>>>>> algorithms (walking the stack) are performed at this point, too.
>>>>>>
>>>>>>> We are not talking about all exceptions only about your NPE
>>>>>>> extended
>>>>>>> error message.
>>>>>> Hmm, the inconsistency caused by the code you posted above
>>>>>> holds for all exceptions. If you fiddle with the stack trace,
>>>>>> the message might become pointless. Wrt. setStackTrace
>>>>>> they all behave the same.
>>>>>> Wrt. fillInStackTrace the message will be wrong. Only this
>>>>>> needs to be fixed.
>>>>>>
>>>>>> Best regards,
>>>>>> Goetz.
>>>>>>
>>>>>>
>>>>>>> David
>>>>>>> -----
>>>>>>>
>>>>>>>> I implemented an example where wrong stack traces are
>>>>>>>> printed with LinkageError and NPE, modifying a jtreg test:
>>>>>>>> http://cr.openjdk.java.net/~goetz/wr20/8248476-
>>>> NPE_fillInStackTrace-
>>>>>>> jdk15/05/mess_with_exceptions.patch
>>>>>>>> See also the generated output added to a comment in the patch.
>>>>>>>> If the NEP message text was missing in the second printout, I
>>>>>>>> think
>>>>>>>> this really would be unexpected.
>>>>>>>> Please note that the correct message is printed after messing
>>>>>>>> with the stack trace, it's the stack trace that is wrong.
>>>>>>>> (Not as with the problem I am fixing here where a wrong
>>>>>>>> message is printed.)
>>>>>>>>
>>>>>>>> Best regards,
>>>>>>>> Goetz.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>> I guess the normal usecase of setStackTrace is the other way
>>>>>>>>>> around:
>>>>>>>>>> Change the message and throw a new exception with the existing
>>>>>>>>>> stack trace:
>>>>>>>>>>
>>>>>>>>>> try {
>>>>>>>>>> a.x;
>>>>>>>>>> catch (NullPointerException e) {
>>>>>>>>>> throw new NullPointerException("My own error
>>>>>>>>> message").setStackTrace(e.getStackTrace);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> And not taking an arbitrary stack trace and put it into an
>>>>>>>>>> exception
>>>>>>>>>> with existing message.
>>>>>>>>> Interesting usage.
>>>>>>>>>
>>>>>>>>> Cheers,
>>>>>>>>> David
>>>>>>>>> -----
>>>>>>>>>
>>>>>>>>>> Best regards,
>>>>>>>>>> Goetz.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> -----Original Message-----
>>>>>>>>>>> From: David Holmes <david.holmes at oracle.com>
>>>>>>>>>>> Sent: Friday, July 3, 2020 9:30 AM
>>>>>>>>>>> To: Lindenmaier, Goetz <goetz.lindenmaier at sap.com>;
>>>> 'forax at univ-
>>>>>>>>> mlv.fr'
>>>>>>>>>>> <forax at univ-mlv.fr>; Alan Bateman <Alan.Bateman at oracle.com>
>>>>>>>>>>> Cc: Christoph Dreis <christoph.dreis at freenet.de>;
>>>>>>>>>>> hotspot-runtime-dev
>>>>>>>>>>> <hotspot-runtime-dev at openjdk.java.net>
>>>>>>>>>>> Subject: Re: [15] RFR: 8248476: No helpful NullPointerException
>>>>>>> message
>>>>>>>>>>> after calling fillInStackTrace
>>>>>>>>>>>
>>>>>>>>>>> Hi Goetz,
>>>>>>>>>>>
>>>>>>>>>>> On 3/07/2020 4:32 pm, Lindenmaier, Goetz wrote:
>>>>>>>>>>>> Hi,
>>>>>>>>>>>>
>>>>>>>>>>>>> True. To ensure you process the original backtrace only you
>>>>>>>>>>>>> need to
>>>>>>>>> add
>>>>>>>>>>>>> synchronization in getMessage():
>>>>>>>>>>>> http://cr.openjdk.java.net/~goetz/wr20/8248476-
>>>>>>> NPE_fillInStackTrace-
>>>>>>>>>>> jdk15/05/
>>>>>>>>>>>> I added the volatile, too, but as I understand the
>>>>>>>>>>>> synchronized
>>>>>>>>>>>> block brings sufficient memory barriers that this also works
>>>>>>>>>>>> without.
>>>>>>>>>>> No "volatile" needed, or wanted, when all access is within
>>>>>>>>>>> synchronized
>>>>>>>>>>> regions.
>>>>>>>>>>>
>>>>>>>>>>>>> To be honest the idea that someone would share an exception
>>>>>>> instance
>>>>>>>>>>> and
>>>>>>>>>>>>> concurrently mutate it with fillInStackTrace() whilst
>>>>>>>>>>>>> printing out
>>>>>>>>>>>>> information about it just seems highly unrealistic.
>>>>>>>>>>>> Yes, contention here is quite unlikely, so it should not harm
>>>>>>> performance
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Contention was not my concern at all. :)
>>>>>>>>>>>
>>>>>>>>>>>>> Though after looking at comments in the test I would also
>>>>>>>>>>>>> suggest that setStackTrace be updated:
>>>>>>>>>>>> The test shows that after setStackTrace still the correct
>>>>>>>>>>>> message
>>>>>>>>>>>> is computed. This is because the algorithm uses
>>>>>>>>>>>> Throwable::backtrace
>>>>>>>>>>>> and not Throwable::stacktrace. Throwable::backtrace is not
>>>>>>>>>>>> affected by setStackTrace.
>>>>>>>>>>>> The behavior is just as with any exception. If you fiddle
>>>>>>>>>>>> with the stack trace, but don't adapt the message text,
>>>>>>>>>>>> the message might refer to other code than the stack trace
>>>>>>>>>>>> points to.
>>>>>>>>>>> But you can't adapt the message text - there is no
>>>>>>>>>>> setMessage! If
>>>>>>>>>>> the
>>>>>>>>>>> message is NULL and you call setStackTrace() then
>>>>>>>>>>> getMessage(), it
>>>>>>> makes
>>>>>>>>>>> no sense to return the extended error message that was
>>>>>>>>>>> associated
>>>>>>> with
>>>>>>>>>>> the original stack/backtrace.
>>>>>>>>>>>
>>>>>>>>>>> Cheers,
>>>>>>>>>>> David
>>>>>>>>>>>
>>>>>>>>>>>> Best regards,
>>>>>>>>>>>> Goetz.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> -----Original Message-----
>>>>>>>>>>>>> From: David Holmes <david.holmes at oracle.com>
>>>>>>>>>>>>> Sent: Friday, July 3, 2020 3:37 AM
>>>>>>>>>>>>> To: Lindenmaier, Goetz <goetz.lindenmaier at sap.com>;
>>>>>>> 'forax at univ-
>>>>>>>>>>> mlv.fr'
>>>>>>>>>>>>> <forax at univ-mlv.fr>; Alan Bateman <Alan.Bateman at oracle.com>
>>>>>>>>>>>>> Cc: Christoph Dreis <christoph.dreis at freenet.de>; hotspot-
>>>> runtime-
>>>>>>> dev
>>>>>>>>>>>>> <hotspot-runtime-dev at openjdk.java.net>
>>>>>>>>>>>>> Subject: Re: [15] RFR: 8248476: No helpful
>>>>>>>>>>>>> NullPointerException
>>>>>>>>> message
>>>>>>>>>>>>> after calling fillInStackTrace
>>>>>>>>>>>>>
>>>>>>>>>>>>> Hi Goetz,
>>>>>>>>>>>>>
>>>>>>>>>>>>> On 3/07/2020 5:30 am, Lindenmaier, Goetz wrote:
>>>>>>>>>>>>>> Hi Remi,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> But how does volatile help?
>>>>>>>>>>>>>> I see the test for numStackTracesFilledIn == 1 then gets
>>>>>>>>>>>>>> always the
>>>>>>>>>>>>>> right value.
>>>>>>>>>>>>>> But the backtrace may not be changed until I read it in
>>>>>>>>>>>>>> getExtendedNPEMessage. The other thread could change it
>>>> after
>>>>>>>>>>>>>> checking numStackTracesFilledIn and before I read the
>>>> backtrace.
>>>>>>>>>>>>> True. To ensure you process the original backtrace only you
>>>>>>>>>>>>> need to
>>>>>>>>> add
>>>>>>>>>>>>> synchronization in getMessage():
>>>>>>>>>>>>>
>>>>>>>>>>>>> public String getMessage() {
>>>>>>>>>>>>> String message = super.getMessage();
>>>>>>>>>>>>> // If the stack trace was changed the
>>>>>>>>>>>>> extended
>>>>>>>>>>>>> NPE algorithm
>>>>>>>>>>>>> // will compute a wrong message.
>>>>>>>>>>>>> + synchronized(this) {
>>>>>>>>>>>>> ! if (message == null &&
>>>>>>>>>>>>> numStackTracesFilledIn ==
>>>>>>>>>>>>> 1) {
>>>>>>>>>>>>> ! return getExtendedNPEMessage();
>>>>>>>>>>>>> ! }
>>>>>>>>>>>>> + }
>>>>>>>>>>>>> return message;
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>> To be honest the idea that someone would share an exception
>>>>>>> instance
>>>>>>>>>>> and
>>>>>>>>>>>>> concurrently mutate it with fillInStackTrace() whilst
>>>>>>>>>>>>> printing out
>>>>>>>>>>>>> information about it just seems highly unrealistic. But the
>>>>>>>>>>>>> above fixes
>>>>>>>>>>>>> it simply. Though after looking at comments in the test I
>>>>>>>>>>>>> would
>>>>>>>>>>>>> also
>>>>>>>>>>>>> suggest that setStackTrace be updated:
>>>>>>>>>>>>>
>>>>>>>>>>>>> synchronized (this) {
>>>>>>>>>>>>> if (this.stackTrace == null && //
>>>>>>>>>>>>> Immutable stack
>>>>>>>>>>>>> backtrace == null) // Test for out of
>>>>>>>>>>>>> protocol state
>>>>>>>>>>>>> return;
>>>>>>>>>>>>> + numStackTracesFilledIn++;
>>>>>>>>>>>>> this.stackTrace = defensiveCopy;
>>>>>>>>>>>>> }
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>> as that would seem to be another hole in the mechanism.
>>>>>>>>>>>>>
>>>>>>>>>>>>>> I want to vote again for the much more simple version
>>>>>>>>>>>>>> proposed in webrev 02:
>>>>>>>>>>>>>> http://cr.openjdk.java.net/~goetz/wr20/8248476-
>>>>>>>>> NPE_fillInStackTrace-
>>>>>>>>>>>>> jdk15/02/
>>>>>>>>>>>>>
>>>>>>>>>>>>> I much prefer the latest version that recognises that only
>>>>>>>>>>>>> the
>>>>>>>>>>>>> original
>>>>>>>>>>>>> stack can be processed.
>>>>>>>>>>>>>
>>>>>>>>>>>>> In the test:
>>>>>>>>>>>>>
>>>>>>>>>>>>> + // This holds for explicitly crated NPEs, but also
>>>>>>>>>>>>> for implicilty
>>>>>>>>>>>>>
>>>>>>>>>>>>> Two typos: crated & implicilty
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>> David
>>>>>>>>>>>>> -----
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>> It's drawback is only that for this code:
>>>>>>>>>>>>>> ex = null;
>>>>>>>>>>>>>> ex.fillInStackTrace()
>>>>>>>>>>>>>> no message is created.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I think this really is acceptable.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Remi, I didn't comment on this statement from a previous
>>>>>>>>>>>>>> mail:
>>>>>>>>>>>>>>>> Hmm, Throwable.stackTrace is used for the stack trace at
>>>> some
>>>>>>>>> point.
>>>>>>>>>>>>>>> yes, it contains the Java stack trace, but if the Java
>>>>>>>>>>>>>>> stack
>>>>>>>>>>>>>>> trace is
>>>>>>> filled
>>>>>>>>>>> you
>>>>>>>>>>>>> don't
>>>>>>>>>>>>>>> compute any helpful message anyway.
>>>>>>>>>>>>>> The internal structure is no more deleted when the stack
>>>>>>>>>>>>>> trace
>>>>>>>>>>>>>> is filled. So the message can be computed later, too.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>> Goetz.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> -----Original Message-----
>>>>>>>>>>>>>>> From: forax at univ-mlv.fr <forax at univ-mlv.fr>
>>>>>>>>>>>>>>> Sent: Thursday, July 2, 2020 8:52 PM
>>>>>>>>>>>>>>> To: Alan Bateman <Alan.Bateman at oracle.com>
>>>>>>>>>>>>>>> Cc: Lindenmaier, Goetz <goetz.lindenmaier at sap.com>;
>>>> Christoph
>>>>>>>>> Dreis
>>>>>>>>>>>>>>> <christoph.dreis at freenet.de>; hotspot-runtime-dev <hotspot-
>>>>>>>>> runtime-
>>>>>>>>>>>>>>> dev at openjdk.java.net>; David Holmes
>>>>>>> <david.holmes at oracle.com>
>>>>>>>>>>>>>>> Subject: Re: [15] RFR: 8248476: No helpful
>>>> NullPointerException
>>>>>>>>>>> message
>>>>>>>>>>>>>>> after calling fillInStackTrace
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> yes,
>>>>>>>>>>>>>>> it's what i was saying,
>>>>>>>>>>>>>>> given that a NPE can be thrown very early, before
>>>>>>>>>>>>>>> VarHandle is
>>>>>>>>>>> initialized,
>>>>>>>>>>>>> i
>>>>>>>>>>>>>>> believe that declaring numStackTracesFilledIn volatile
>>>>>>>>>>>>>>> is the
>>>>>>>>>>>>>>> best
>>>>>>> way
>>>>>>>>> to
>>>>>>>>>>>>>>> tackle that.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Rémi
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> ----- Mail original -----
>>>>>>>>>>>>>>>> De: "Alan Bateman" <Alan.Bateman at oracle.com>
>>>>>>>>>>>>>>>> À: "Goetz Lindenmaier" <goetz.lindenmaier at sap.com>,
>>>>>>> "Christoph
>>>>>>>>>>>>> Dreis"
>>>>>>>>>>>>>>> <christoph.dreis at freenet.de>
>>>>>>>>>>>>>>>> Cc: "hotspot-runtime-dev" <hotspot-runtime-
>>>>>>>>> dev at openjdk.java.net>,
>>>>>>>>>>>>>>> "David Holmes" <david.holmes at oracle.com>, "Remi Forax"
>>>>>>>>>>>>>>>> <forax at univ-mlv.fr>
>>>>>>>>>>>>>>>> Envoyé: Jeudi 2 Juillet 2020 20:47:31
>>>>>>>>>>>>>>>> Objet: Re: [15] RFR: 8248476: No helpful
>>>> NullPointerException
>>>>>>>>> message
>>>>>>>>>>>>>>> after calling fillInStackTrace
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On 02/07/2020 17:45, Lindenmaier, Goetz wrote:
>>>>>>>>>>>>>>>>> Hi Christoph,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I fixed the comment, thanks for pointing that out.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> One other thing is that NPE::getMessage reads
>>>>>>>>> numStackTracesFilledIn
>>>>>>>>>>>>>>>> without synchronization.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> -Alan
>>
>
More information about the hotspot-runtime-dev
mailing list