Re: [PATCH] Trivial warning fix for imap-send.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



H. Peter Anvin wrote:
A Large Angry SCM wrote:
Mark Wooding wrote:

Linus Torvalds <torvalds@xxxxxxxx> 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 <bold>void *</bold>, 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 <stddef.h> as a null pointer constant; see 4.1.5.

-
: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]