RFR (S): 8211394: CHECK_ must be used in the rhs of an assignment statement within a block
David Holmes
david.holmes at oracle.com
Mon Oct 8 22:33:29 UTC 2018
On 9/10/2018 8:04 AM, Hohensee, Paul wrote:
> Also, patch looks good to me. And typeo: TRAPS s/b THREAD.
Thanks for looking at this Paul.
> On 10/8/18, 6:01 PM, "Hohensee, Paul" <hohensee at amazon.com> wrote:
>
> In this example, if you want to define the interface to new_symbol
> as returning NULL if an exception is thrown, then you'd replace CHECK_NULL
with TRAPS, as the previous patches have done. You'd document that so
users of new_symbol could do that. Absent that definition (or if you're
a bit lazy!), you use CHECK_NULL.
Given that 99.9% of hotspot API's are not actually specified/documented ...
>
> I'd add a comment to exceptions.hpp along the lines of
>
> // Because the CHECK_ macros expand to multiple statements,
> // they must be used in the context of a statement block such
> // that the exception check is not dead code. So, e.g., they
> // cannot be used as a return statement expression. Consider
> // using THREAD instead if part of the method interface is that
> // the callee does the exception check.
Okay will add that.
Still don't understand why the compilers don't help us out here. :(
Thanks,
David
> Paul
>
> On 10/8/18, 5:21 PM, "hotspot-runtime-dev on behalf of David Holmes" <hotspot-runtime-dev-bounces at openjdk.java.net on behalf of david.holmes at oracle.com> wrote:
>
> Hi Ioi,
>
> On 9/10/2018 1:55 AM, Ioi Lam wrote:
> > I am not sure if this change is really required:
> >
> > Symbol* MethodFamily::generate_no_defaults_message(TRAPS) const {
> > - return SymbolTable::new_symbol("No qualifying defaults found", THREAD);
> > + Symbol* s = SymbolTable::new_symbol("No qualifying defaults found",
> > CHECK_NULL);
> > + return s;
> >
> > I think the rationale is "since SymbolTable is a different class, we
> > don't know what value it returns when an exception is thrown."
>
> Yes. Seems important to try and establish some consistency on how to
> handle this.
>
> > However, the return value is a pointer type. Can we except anything
> > other than NULL in case of an exception? I think using the CHECK_NULL
> > here will make the code bigger and slower, and also harder to read.
>
> We shouldn't expect anything other than an "error return value" if an
> exception is pending, but that relies on who/how the target code was coded.
>
> I don't think the code change will be at all noticeable in terms of size
> of speed. Readability is subjective.
>
> Thanks,
> David
> -----
>
> > (BTW, we have at 150+ occurrencesof 'return.*THREAD[)];' in the code.)
>
>
>
> > Thanks
> > - Ioi
> >
> > On 10/7/18 3:08 PM, David Holmes wrote:
> >> Bug: https://bugs.openjdk.java.net/browse/JDK-8211394
> >> webrev: http://cr.openjdk.java.net/~dholmes/8211394/webrev/
> >>
> >> If a CHECK_ macro is used on a function call that is part of a return
> >> statement i.e.
> >>
> >> return foo(CHECK_NULL);
> >>
> >> then it expands into an unreachable if-statement that checks the
> >> exception state:
> >>
> >> return foo();
> >> if (EXCEPTION_OCCURRED)
> >> return NULL;
> >>
> >> This is obviously a programming error, but unfortunately not something
> >> our often pedantic compilers complain about.
> >>
> >> There are two ways to fix:
> >>
> >> 1. Convert to assignment:
> >>
> >> T* t = foo(CHECK_NULL);
> >> return t;
> >>
> >> 2. If the method is local and its exception behaviour easily
> >> discernible and matches the expected behaviour, then change CHECK_ to
> >> THREAD
> >>
> >> return foo(THREAD);
> >>
> >> Both fixes are applied as appropriate. As per the bug report I also
> >> revisited an earlier fix in this area - JDK-8062808 - and made
> >> adjustments.
> >>
> >> Thanks,
> >> David
> >
>
>
>
>
More information about the hotspot-runtime-dev
mailing list