From: A Large Angry SCM Date: Mon, 13 Mar 2006 04:36:01 GMT Subject: Re: [PATCH] Trivial warning fix for imap-send.c Message-ID: <4414F6B1.9080107@gmail.com> In-Reply-To: <4414E000.9030902@zytor.com> H. Peter Anvin wrote: > A Large Angry SCM wrote: >> Mark Wooding wrote: >> >>> Linus Torvalds wrote: >>> >>>> So in modern C, using NULL at the end of a varargs array as a >>>> pointer is perfectly sane, and the extra cast is just ugly and >>>> bowing to bad programming practices and makes no sense to anybody >>>> who never saw the horror that is K&R. >>> >>> No! You can still get bitten. You're lucky that on common platforms >>> all pointers look the same, but if you find one where `char *' (and >>> hence `void *') isn't the same as `struct foo *' then, under appropriate >>> circumstances you /will/ unless you put the casts in. >> >> Please explain how malloc() can work on such a platform. My reading of >> the '89 ANSI C spec. finds that _ALL_ (non function) pointers _are_ >> cast-able to/from a void * and that NULL should be #defined as (void >> *). See 3.2.2.3 and 4.1.5 if interested. > > Consider the non-hypothetical example of a word-addressed machine, which > has to have extra bits in a subword pointer like char *. The C standard > requires that void * has those bits as well, but it doesn't means that > any void * can be cast to any arbitrary pointer -- the opposite, > however, is required. ANSI X3.159-1989 3.2.2.3 Pointers A pointer to *void* may be converted to or from a pointer to any incomplete or object type. A pointer to any incomplete or object type may be converted to a pointer to *void* and back again; the result shall compare equal to the original pointer. For any qualifier /q/, a pointer to a non-/q/-qualified type may be converted to a pointer to the /q/-qualified version of the type; the values stored in the original and converted pointers shall compare equal. In integral constant expression with value 0, or such an expression cast to type void *, is called a /null pointer constant.[*33*] If a null pointer constant is assigned to or compared for equality to a pointer, the constant is converted to a pointer of that type. Such a pointer, called a /null pointer/, is guaranteed to compare unequal to a pointer to any object or function. Two null pointers, converted through possibly different sequences of casts to pointer types, shall compare equal. [*33*] the macro *NULL* is defined in as a null pointer constant; see 4.1.5.