[cfe-dev] Fixing selector types on the GNU runtime

Sebastian Redl sebastian.redl at getdesigned.at
Sun Jan 18 14:12:52 PST 2009


Chris Lattner wrote:
> On Jan 18, 2009, at 8:14 AM, David Chisnall wrote:
>   
>> I've also included some fixes in this patch which turn NULL into  
>> (void*)0 when it is used as a sentinel in variadic functions.  This  
>> gets rid of a load of warnings when compiling and stops it breaking  
>> on 64-bit architectures.
>>     
>
> Why are you getting this?  There are tons of other places that pass  
> NULL as a sentinel.  Is NULL getting defined incorrectly for that  
> file?  NULL needs to be a pointer type, so it should be fine on 64-bit  
> systems.  Passing a raw "0" would not be.
>   
In C++, NULL cannot be a pointer type, because there is no implicit cast
from void* to other pointers. So it is usually defined to be 0 or 0L. In
GCC, it's defined to be __null, but that's just 0 with a warning when
used as an integer.

So some compiler might be smart enough to convert its __null equivalent
to pointer size when passed as vararg, or to define NULL to an integer
constant that is actually the platform pointer size (e.g. 0L for GCC,
but 0LL for MSVC), but I really wouldn't rely on it. The standard fails
to specify that NULL must be as wide as a pointer (a defect IMO), so you
can't trust the constant.

It's one of the most subtle and evil gotchas in C++, really.

Sebastian



More information about the cfe-dev mailing list