[comp.lang.c] Casting |void *| values

karl@haddock.ISC.COM (Karl Heuer) (05/12/88)

In article <1543@rpp386.UUCP> jfh@rpp386.UUCP (The Beach Bum) writes:
>In article <7822@brl-smoke.ARPA> gwyn@brl.arpa (Doug Gwyn) writes:
>>General, SVR2 "lint" will complain about casting the (char *) returned by
>>malloc() into other pointer types, and there seems to be no way around it.
>
>... what i learned was that if i declared "void *malloc();" then lint shut
>up.  this would seem to be the correct behavior for an ANSI conforming lint
>... well, karl, what you got to say???

Warnings are not specified in the Standard, but appendix A.5 lists "a few
of the more common situations", and can probably be used as a rough guide.

One of the (suggested?) warnings is "an implicit narrowing conversion is
encountered, such as ... a pointer to |void| to a pointer to any type of
object other than |char|".  This covers uncasted assignment of malloc().

The guaranteed alignment is a property of malloc(), not a general property of
|void *|.  It should probably be declared with a #pragma (or a lintpragma,
which could be spelled "/*ALIGNED*/" in the UNIX tradition).

I recognize that many people believe uncasted malloc() is now kosher, and that
many ANSI compilers/lints will agree.  I don't have to like it, and my own
code won't depend on such sloppiness.  If I were to write a compiler, I'd
probably make this warning an option.

Given the obvious declarations, "ip = memcpy(ip1, ip2, n)" is correct, but
"ip = memcpy(cp1, cp2, n)" is wrong.  The inability of the type system to
detect this at compile-time bothers me, but I'm not sure what to do about it,
other than [0] implement a smart #pragma, or [1] use type-specific macros
as a front end to memcpy() (I've sometimes done this for malloc()).

Karl W. Z. Heuer (ima!haddock!karl or karl@haddock.isc.com), The Walking Lint
Followups to comp.std.c.