Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 May 2009 16:59:03 +0100
From:      Andrew Brampton <brampton+freebsd-hackers@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   Definition of NULL
Message-ID:  <d41814900905020859q4faff431p8819aaf38dfe9e78@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
I'm writing a C++ Kernel Module, and one thing that has been bugging
me is the kernel's definition of NULL.

sys/sys/_null.h (in CURRENT):

#if defined(_KERNEL) || !defined(__cplusplus)
#define NULL    ((void *)0)
#else
#if defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4
#define NULL    __null
#else
#if defined(__LP64__)
#define NULL    (0L)
#else
#define NULL    0
#endif  /* __LP64__ */
#endif  /* __GNUG__ */
#endif  /* _KERNEL || !__cplusplus */

>From what I've read online the definition of NULL in C is (void *)0,
whereas in C++ it should be 0, or 0L (on 64bit machines).

Now, my C++ kernel module is built with _KERNEL definited, like any
other C kernel module. This leads to NULL being defined incorrectly.

So I have a question and two suggestions. Firstly, why is the #if
defined(_KERNEL) in _null.h? Is it to stop userland application
applications picking up this definition? Or for another reason?

and two, how about we change the first line of _null.h so that we use
a && instead of a || like so:
#if defined(_KERNEL) && !defined(__cplusplus)

That should ensure the definition is correct. Or, a more radical
approach, we could remove the check for _KERNEL, since I can't figure
out why it is needed and do something like:

#if defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4
# define NULL    __null
#elif !defined(__cplusplus)
# define NULL    ((void *)0)
#elif defined(__LP64__)
# define NULL    (0L)
#else
# define NULL    0
#endif

That way, if we are using GCC 4+ we use their __null definition,
otherwise if we are not c++ we use the standard (void *)0, and then if
we are 64bit we use 0L, and finally anything else uses 0. A quick
amd64 kernel compile seems to allow my new definition

I hope this makes sense, and I welcome all feedback.
Andrew



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d41814900905020859q4faff431p8819aaf38dfe9e78>