RFR: 8064811: Use THREAD instead of CHECK_NULL in return statements
Stefan Karlsson
stefan.karlsson at oracle.com
Fri Nov 14 08:39:36 UTC 2014
Hi Volker,
On 2014-11-13 18:24, Volker Simonis wrote:
> Hi Stefan,
>
> thanks a LOT for doing this change. This one was on my list since
> years (see "6889002: CHECK macros in return constructs lead to
> unreachable code" at https://bugs.openjdk.java.net/browse/JDK-6889002)
> but I never finalized it.
I didn't CHECK for already open bugs/enhancements for this ;)
>
> Your change looks good and I think it must be stressed that your code
> doesn't change any functionality because it only eliminates dead code!
>
> If we will have code after your change which fails to check for
> pending exceptions or which expects to get a certain result in the
> case of a pending exceptions it was just es wrong already before your
> change because the exception check was never reached. So unless we see
> one of these errors I don't think it will be necessary to introduce
> all these temporary variables.
>
> When I started to work on this problem years ago I went the other way
> round: I looked at the called functions (i.e. klass_at() in your
> example) to check if they already return NULL in the case of a pending
> exception. As far as I remember they all behaved "well" - otherwise we
> would already have seen some problems with the current implementation.
Thanks for verifying this.
>
> Thanks and best regards,
> Volker
>
> PS: our HPUX C++ compiler will love this change:)
Great!
Thanks,
StefanK
>
>
> On Thu, Nov 13, 2014 at 4:28 PM, Stefan Karlsson
> <stefan.karlsson at oracle.com> wrote:
>> On 2014-11-13 16:33, Coleen Phillimore wrote:
>>>
>>> The thing that I worry about with this change is that if someone adds code
>>> later after the return, they'll miss changing the THREAD parameter back into
>>> CHECK.
>>
>>
>> I was thinking the same, but I knew the we used this idiom in other places
>> in the JVM and thought that changing these would be OK. An alternative
>> approach would be to always read out the value into a variable:
>>
>> Klass* ConstantPool::klass_ref_at(int which, TRAPS) {
>> Klass* k = klass_at(klass_ref_index_at(which), CHECK_NULL);
>> return k;
>> }
>>
>> I can do that if people feel more comfortable with it.
>>
>> Thanks,
>> Stefank
>>
>>
>>> But maybe it's okay because the thing returned will be NULL and code is
>>> likely to crash on someone trying to use the value returned. Ok. This is a
>>> good cleanup. I'm surprised there weren't more.
>>>
>>> Thanks,
>>> Coleen
>>>
>>> On 11/13/14, 9:59 AM, Stefan Karlsson wrote:
>>>> Hi all,
>>>>
>>>> Please, review this patch to replace usages of the CHECK_ macros in
>>>> return statements, with the THREAD define.
>>>>
>>>> http://cr.openjdk.java.net/~stefank/8064811/webrev.01/
>>>> https://bugs.openjdk.java.net/browse/JDK-8064811
>>>>
>>>> From the bug report:
>>>>
>>>> Take the following method as an example:
>>>> Klass* ConstantPool::klass_ref_at(int which, TRAPS) {
>>>> return klass_at(klass_ref_index_at(which), CHECK_NULL);
>>>> }
>>>>
>>>> This will expand into:
>>>> Klass* ConstantPool::klass_ref_at(int which, TRAPS) {
>>>> return klass_at(klass_ref_index_at(which), THREAD);
>>>> if (HAS_PENDING_EXCEPTIONS) {
>>>> return NULL;
>>>> }
>>>> (void)(0);
>>>> }
>>>>
>>>> The if-statement will never be reached.
>>>>
>>>> We have seen cases where the compiler warns about this, and the recent
>>>> change to enable -Wreturn-type will make this more likely to happen.
>>>>
>>>> The suggested solution is to change the example above into:
>>>> Klass* ConstantPool::klass_ref_at(int which, TRAPS) {
>>>> return klass_at(klass_ref_index_at(which), THREAD);
>>>> }
>>>>
>>>> thanks,
>>>> StefanK
>>>
More information about the hotspot-dev
mailing list