char * cast on NULL?
Roland Illig
roland.illig at gmx.de
Sun Sep 26 12:08:21 UTC 2004
Leonard den Ottolander wrote:
> Hello Oswald,
>
> On Sun, 2004-09-26 at 13:15, Oswald Buddenhagen wrote:
>
>>the outcome is, that it doesn't matter anywhere but when passing null
>>pointers through varargs. in all other cases it's about style, and taste
>>differs.
>
>
> All in all it seems rather pointless to do this in only certain parts of
> the code and at this point in time (approaching 4.6.1). If I need to
> know the type of the last argument I can find it elsewhere.
That's almost always correct, due to function prototypes. But there's
one exception to it: varargs. (As Oswald noted above)
Imagine a machine where pointers take 32 bit and ints take 16.
/* concat strings */
void concat(const char *first, ...);
Then you call:
/*1*/ concat ("first", "second", (char *) NULL);
/*2*/ concat ("first", "second", NULL);
/*3*/ concat ("first", "second", 0);
The function concat expects their arguments to be strings, but the
compiler cannot guarantee that only strings are passed. So see what
could happen: Let's say the address of first is 0xc0000040, the address
of second is 0xc0000050. Then the arguments (grouped in 16 bits) could be:
/*1*/ [0xc000] [0x0040] [0xc000] [0x0050] [0x0000] [0x0000] [garbage...]
/*3*/ [0xc000] [0x0040] [0xc000] [0x0050] [0x0000] [garbage...]
Some systems actually #define NULL to be 0, so case /*2*/ could be
either like /*1*/ or like /*3*/. But in case /*3*/, the string list is
not terminated correctly, and a segmentation fault will occur.
Roland
More information about the mc-devel
mailing list