Warning on Alpha Linux

Todd Vierling tv at pobox.com
Sat Jul 19 12:10:19 CDT 2003


On Sat, 19 Jul 2003, Shachar Shemesh wrote:

: >Use intptr_t.  If that's not available (via autoconf test), typedef intptr_t
: >to be "unsigned long" locally, as "long" is the size of a pointer on all
: >typical ILP32 and LP64 hosts.

: The reason something is a warning and not an error is that it MAY have a
: legitimate use. As such, there should always be a way to change the code
: so that it will keep the same meaning, but will avoid the warning in the
: future.

Yes.  "Use intptr_t", just like I've already said.

: In this particular case, for example, what does applying the
: following change do?
: -    if (!((int)id >> 16)) return wine_dbg_sprintf( "<guid-0x%04x>",
: (int)id & 0xffff );
: +    if (!((int)id >> 16)) return wine_dbg_sprintf( "<guid-0x%04x>",
: (UINT16)id );
:
: I'm a bit confused. gcc seems to be warning us about an explicit cast?

Yes, because explicitly casting a pointer to an integer of a smaller size is
unportable (it's even warned against in the current C standards), and can
cause crashes.  The most common usage is void* -> int -> void*, which used
to be in huge swaths of C code before it was pruned out for LP64 usage.

To do this correctly per the C standard, cast to an integer of at least the
pointer's size (intptr_t), and then cast it further down:

For the first case,

    ((intptr_t)id >> 16)

For the second one,

    (UINT16)(intptr_t)id

-- 
-- Todd Vierling <tv at pobox.com>



More information about the wine-devel mailing list