RFR: 8065585: Change ShouldNotReachHere() to never return
Stefan Karlsson
stefan.karlsson at oracle.com
Thu Apr 16 06:11:08 UTC 2015
On 2015-04-16 01:04, Kim Barrett wrote:
> On Apr 15, 2015, at 6:49 AM, Stefan Karlsson <stefan.karlsson at oracle.com> wrote:
>> We might want to change the the behavior of Unimplemented() and Untested(...), but they are used a lot in compiler code, so I've not changed them for this patch. There has been request to leave guarantee(...) unchanged so that they can be turned off in production code.
>>
>> I had to change some instance of ShouldNotReachHere() in destructors, because the VS C++ compiler complained about potential memory leaks.
>>
>> http://cr.openjdk.java.net/~stefank/8065585/webrev.01/
>> https://bugs.openjdk.java.net/browse/JDK-8065585
> Nice! A few comments:
>
> ------------------------------------------------------------------------------
>> There has been request to leave guarantee(...) unchanged so that they
>> can be turned off in production code.
> Isn't that what assert() is for?
Support wants to be able to turn of guarantees in a few cases where we
actually don't have to shutdown the JVM if the guarantee is hit.
>
> I'm not sure whether guarantee() should use noreturn or not. Not, for
> consistency with assert() and for the same reasons has some appeal.
> On the other hand, guarantee() is supposed to be for use in production
> contexts.
>
> I'm wondering if guarantee() might be one (and quite possibly the
> only) place where we might consider making the use of noreturn
> conditional. This would make use of guarantee() is little trickier,
> e.g. guarantee(false, ...) is probably not sensible with that sort of
> configuration. But we ought to be using fatal in such a situation
> anyway.
Since guarantee can, and often will :), return it shouldn't be marked
with noreturn. I was thinking about the guarantee(false, ...) use case.
>
> ------------------------------------------------------------------------------
> Many missing copyright updates.
Yes. I usually don't update copyrights when I send out my review requests.
>
> ------------------------------------------------------------------------------
> src/cpu/x86/vm/x86_32.ad
> 1212 Unimplemented();
> 1213 return 0; // Mute compiler
> =>
> 1212 fatal("Unimplemented");
>
> Why was this changed? The email describing the change makes me think
> this shouldn't be part of this change set.
It might be a left-over from when I tried to change Unimplemented. I'll
take a look at it.
>
> ------------------------------------------------------------------------------
> src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
> 895 fatal(err_msg("Unknown dest state: " CSETSTATE_FORMAT, dest.value()));
> 896 break;
>
> Shouldn't the "break" also be unnecessary here?
Probably. I'll test.
>
> ------------------------------------------------------------------------------
> src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp
> 42 guarantee(false, "Should never be destroyed");
>
> guarantee => fatal.
No. If I do that change, then the VS C++ compiler complains that we leak
memory since we never return from the destructor. But maybe it's better
to find a way to turn off that warning?
>
> ------------------------------------------------------------------------------
> src/share/vm/utilities/debug.hpp
>
> I think some commentary explaining why assert() and friends do *not*
> use the noreturn form of error error reporting might be in order. I'm
> guessing it is to improve the debugging experience for fastdebug
> builds; if assert used noreturn reporting then interesting values
> might be dead and optimized away, making them inaccessible in the
> debugger.
You can return from assert, that's why it's not marked with noreturn.
>
> ------------------------------------------------------------------------------
> src/share/vm/utilities/hashtable.hpp
> 62 BasicHashtableEntry() { guarantee(false, "Should not be called"); }
> ...
> 65 ~BasicHashtableEntry() { guarantee(false, "Should not be called"); }
>
> guarantee => fatal.
>
> And by the way, this whole mechanism invokes undefined behavior. I
> suspect someone didn't understand placement new and delete. But
> that's not a problem with this change set.
Same comment above about the memory leak.
Thanks,
StefanK
>
> ------------------------------------------------------------------------------
>
More information about the hotspot-dev
mailing list