cvs commit: src/lib/libc/stdlib getenv.c

Dag-Erling Smørgrav des at des.no
Sun Sep 23 06:35:57 PDT 2007


Bruce Evans <brde at optusnet.com.au> writes:
> On Sat, 22 Sep 2007, [utf-8] Dag-Erling Smørgrav wrote:
> > s/to remove the warning/to actually work/
> Please be precise :-).
> s/to remove the warning ... on 64-bit platforms/to avoid undefined behaviour
> on platforms where size_t is not u_int, and to avoid having to make a
> delicate analysis to show that the behaviour is defined and correct on
> all other platforms/.
>
> Delicate analysis:
> - size_t is always an unsigned type, but the required type is int, so
>   size_t is never compatible with the required type.
> - on platforms where size_t is smaller than int, the arg type is
>   nevertheless compatible with int, since warnx() is variadic and the
>   arg is one of the variadic args; the default promotions thus apply
>   and the arg is passed as an int whether or not you cast it explicitly
>   to int (but casting it to a type larger than int would break it).
>   FreeBSD doesn't support any platforms in this class.
> - on platforms where size_t is u_int, the arg is passed as a u_int.
>   The analysis for this case is too delicate to give in full here.

you left out the case where size_t is larger than unsigned int, i.e. all
64-bit platforms.  Even if the stack is aligned to the size of size_t,
you will get interesting results on a big-endian system.

DES
-- 
Dag-Erling Smørgrav - des at des.no


More information about the cvs-all mailing list