RFR (M) 8212959: Remove booleans from tests in vmTestbase
David Holmes
david.holmes at oracle.com
Sun Jan 13 21:06:01 UTC 2019
On 14/01/2019 5:28 am, Chris Plummer wrote:
> On 1/13/19 4:14 AM, David Holmes wrote:
>> On 13/01/2019 8:33 am, Chris Plummer wrote:
>>> Hi JC and David,
>>>
>>> Sorry I'm late here. Was out most of the week. I assume by "implicit
>>> boolean" that David means treating an int as a boolean when the the
>>> int could potentially contain a value other than 0 or 1? So if we have:
>>
>> The style guide [1] states:
>>
>> "Do not use ints or pointers as booleans with &&, ||, if, while.
>> Instead, compare explicitly != 0 or != NULL, etc. (See #8 above.)"
>>
>>>
>>> int success;
>>> ...
>>> if (success != NSK_TRUE) {
>>>
>>> You feel the check against NSK_TRUE is needed, and using !success
>>> would potentially yield an incorrect evaluation of the "boolean".
>>
>> No it isn't a correctness issue (though obviously you can use an int
>> incorrectly in such a context) it's a style issue. We regularly
>> eradicate implicit booleans so it is inappropriate to introduce them
>> here.
>
> Ok, but the above code is still incorrect. At least !success would have
> always have given you the right result, so in this case the rule to add
> an explicit comparison has lead to a bug (although in reality it a bug
> that is never exposed). It should be "success == NSK_FALSE".
That's a weird attempted justification. If "success" is not initialized
or can take on any value other than NSK_TRUE or NSK_FALSE then that is a
logic bug pure and simple and its irrelevant how success is tested in a
condition.
Not that these tests would have been written to the hotspot style guide
in the first place. This all goes back to these basically being C-style
tests with no C++ bool used.
David
>
> Chris
>
>>
>> David
>> -----
>>
>> [1] https://wiki.openjdk.java.net/display/HotSpot/StyleGuide
>>
>> Well, if
>>> success is not 0 or 1, then let's say it is 2. You end up with 2 !=
>>> NSK_TRUE, which evaluations true. Compared with !2 which evaluations
>>> false. So clearly there is a difference, but which would you consider
>>> correct in this case? I'd consider the false evaluation correct. If
>>> success is not 0, we want !success to be false. But if you compare
>>> against NSK_TRUE, the evaluation only ends up being false when
>>> success == 1. This doesn't seem right to me, so I would argue that
>>> "success != NSK_TRUE" is not only clumsy coding, but also gives the
>>> wrong result for values other than 0 or 1. In order to correct it,
>>> you would use "success == NSK_FALSE". But I don't understand the
>>> implicit boolean concern with !success when the value is suppose to
>>> always be 0 or 1. Where I would object to do something like this is
>>> with pointer types. Using !ptr is bad. "ptr == NULL" should be used.
>>>
>>> That being said, if JC prefers to clean this up at a later date as
>>> part of changing success to a bool, that's fine by mean also.
>>>
>>> thanks,
>>>
>>> Chris
>>>
>>>
>>> On 1/10/19 9:20 PM, JC Beyler wrote:
>>>> Hi David,
>>>>
>>>> Fair enough. I looked a bit to doing it anyway and it is
>>>> self-contained in a lot of cases but a lot of times the work would
>>>> be greatly simplified if we first factorized utility methods across
>>>> test suites first and then (or at the same time) moved them to using
>>>> bools and not doing the explicit tests.
>>>>
>>>> So, except if anyone objects, I'm closing this bug as won't fix
>>>> and I created https://bugs.openjdk.java.net/browse/JDK-8216533 and
>>>> https://bugs.openjdk.java.net/browse/JDK-8216534 for the
>>>> events/hotswap tests which were the most cases of this anyway.
>>>>
>>>> Thanks for the hold up David :-),
>>>> Jc
>>>>
>>>> On Tue, Jan 8, 2019 at 11:14 PM David Holmes
>>>> <david.holmes at oracle.com <mailto:david.holmes at oracle.com>> wrote:
>>>>
>>>> On 9/01/2019 4:43 pm, JC Beyler wrote:
>>>> > Hi David,
>>>> >
>>>> > I was not planning on doing it but we could. This change came
>>>> from a
>>>> > request to remove the booleans from tests for a prior webrev
>>>> change.
>>>> > I've seen previous conversations about wanting to test explicitly
>>>> > against JNI_TRUE but thought this was a slightly different case.
>>>>
>>>> The basic hotspot style rule is "avoid implicit booleans".
>>>>
>>>> > Basically, from your comment, it seems I could go three ways for
>>>> this
>>>> > change:
>>>> > 1) Not do it and close the bug as won't fix :-)
>>>>
>>>> Certainly the path of least resistance. :)
>>>>
>>>> > 2) Go the extra step and change the various variables being
>>>> tested to
>>>> > bool
>>>> >
>>>> > My preference is to do (2) as much as possible; any case that
>>>> cannot be
>>>> > put in a boolean form without having major changes to the code
>>>> base, I'd
>>>> > leave as is. And then call it a day for this subject.
>>>> >
>>>> > What do you think (ie in cases where the variable can be set to
>>>> a bool,
>>>> > do it and then have the test be an implicit test)?
>>>>
>>>> It's really up to you. It seems a lot of work and I don't know
>>>> if you
>>>> can actually push this all the way through without needing some
>>>> int<->bool conversion somewhere anyway.
>>>>
>>>> Cheers,
>>>> David
>>>>
>>>> > Thanks!
>>>> > Jc
>>>> >
>>>> > On Tue, Jan 8, 2019 at 10:31 PM David Holmes
>>>> <david.holmes at oracle.com <mailto:david.holmes at oracle.com>
>>>> > <mailto:david.holmes at oracle.com
>>>> <mailto:david.holmes at oracle.com>>> wrote:
>>>> >
>>>> > Hi Jc,
>>>> >
>>>> > On 9/01/2019 4:12 pm, JC Beyler wrote:
>>>> > > Hi all,
>>>> > >
>>>> > > Fixing up the tests in vmTestbase to not be testing
>>>> explicitly
>>>> > against
>>>> > > NSK_TRUE/NSK_FALSE. Here is the webrev to do that:
>>>> > >
>>>> > > Bug: https://bugs.openjdk.java.net/browse/JDK-8212959
>>>> > > Webrev:
>>>> http://cr.openjdk.java.net/~jcbeyler/8212959/webrev.00/
>>>> >
>>>> > Hold up! We don't do explicit tests when the variable is a
>>>> bool/boolean
>>>> > but when it is an int, as here, we do.
>>>> >
>>>> > Are you planning on converting everything to use bool?
>>>> >
>>>> > Cheers,
>>>> > David
>>>> >
>>>> > > Thanks,
>>>> > > Jc
>>>> >
>>>> >
>>>> >
>>>> > --
>>>> >
>>>> > Thanks,
>>>> > Jc
>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> Thanks,
>>>> Jc
>>>
>>>
>
>
More information about the serviceability-dev
mailing list