RFR: 8240110: Improve NULL

Kim Barrett kim.barrett at oracle.com
Mon Apr 20 09:23:53 UTC 2020


> On Apr 19, 2020, at 10:35 PM, David Holmes <david.holmes at oracle.com> wrote:
> On 20/04/2020 10:58 am, Kim Barrett wrote:
>>> On Apr 19, 2020, at 6:13 PM, David Holmes <david.holmes at oracle.com> wrote:
>>> 
>>> On 20/04/2020 3:08 am, Leo Korinth wrote:
>>>> What about this?
>>>> #define JVMCI_CHECK_0             JVMCI_CHECK_(NULL_WORD)
>>> 
>>> Why does this integer returning macro need to return NULL_WORD? As I said above if writing this directly I would write "return 0;" in the code. Is this just an attempt under the covers to (eventually) avoid misusing JVMCI_CHECK_0 where JVMCI_CHECK_NULL should have been used?
>> I agree that NULL_WORD has the wrong implication here.
>> As you correctly surmise, the problem with returning `0` is that it is
>> a null pointer constant. It would be nice if JVMCI_CHECK_0 could not
>> be used in a context where a pointer result is expected, and instead
>> require JVMCI_CHECK_NULL in such cases. That was the point of my
>> suggestion of using
>> #define JVMCI_CHECK_0  JVMCI_CHECK_(int(0))
>> The expression `int(0)` is not a null pointer constant, so won't
>> implicitly convert to a null pointer.
> 
> I'm sure I tried something like that when fixing up some misuses of the more general CHECK_0 macro, but it did not help in detecting the misuse.

Drat, you are right; that doesn't have the desired effect, at least
with gcc.

I hadn't noticed some of the evolution of the definition of "null
pointer constant", and have mostly been looking at C++14 for reference
lately. The definition (4.10 in all three below) is:

C++98: an integral constant expression (5.19) rvalue of integer type
that evaluates to zero.

C++11: an integral constant expression (5.19) prvalue of integer type
that evaluates to zero or a prvalue of type std::nullptr_t.

C++14: an integer literal (2.14.2) with value zero or a prvalue of
type std::nullptr_t.

I've been assuming the literal 0 definition. And even so, it seems
that gcc (at least) is using the C++11 definition with -std=c++14. I
don't know what clang or Visual Studio do in C++14 mode.

Rather than using `int(0)`, I think the following would achieve the
goal of preventing JVMCI_CHECK_0 from being used in a pointer context:

inline int JVMCI_CHECK_0_value() { return 0; } // Private helper
#define JVMCI_CHECK_0  JVMCI_CHECK_(JVMCI_CHECK_0_value())

Is that worth the trouble?



More information about the hotspot-dev mailing list