Re: [PATCH] Trivial warning fix for imap-send.c
- From
Jeff King <peff@peff.net>
- Date
- Mar 13, 2006, 03:38 UTC
- Message-ID
- <20060313033805.GB14601@coredump.intra.peff.net>
- In-Reply-To
- <4414747B.7040700@gmail.com>
On Sun, Mar 12, 2006 at 11:20:27AM -0800, A Large Angry SCM wrote:
Show 9 quoted lines
> >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.
I think Linus has cut to the heart of the discussion (that it's worth git maintainers' sanity not to worry about such problems). However, for pedantry's sake, this is how malloc works:
A void pointer is guaranteed to be able to hold any type of pointer (either char * or struct foo * or whatever). The declaration of malloc indicates a return of void *. On a platform where it matters, the compiler generates code so that struct foo *bar = malloc(100); converts the void * pointer into the correct size (in the same way that assigning between differently sized integers works).
This breaks down with variadic functions, which have no typing
information. So doing this:
execl("foo", "bar", my_struct_foo);
doesn't give the compiler a chance to do the implicit cast and you get
subtle breakage (in the same way that you would if you passed a long to
a variadic function expecting a short).-Peff