Re: [RFC] convert a host address to a string

Mark Kettenis
2009-01-07T16:17:07Z

> Date: Wed, 7 Jan 2009 16:19:08 +0400
> From: Joel Brobecker <brobecker@adacore.com>
>
> The host_address_to_string function converts the host address to
> a string using sprintf after having converted the address to an
> unsigned long.
>
> Unfortunately for us, on x86_64-windows, unsigned long is not big
> enough to hold an address. My initial approach was to detect this case
> by using a configure check which defines HOST_IS_LLP64 if sizeof (void*)
> is 8 while sizeof (long) is 4.
>
> Mark's reaction was that we should be able to use something more elegant.
> One of the things we could do, perhaps, is use %p, which is mentioned by
> the comment inside the function. I checked the C90 draft, and %p is
> definitely mentioned, so I suspect it's fine to use it assuming we
> require C90. The problem is, are we going to break the build on some
> targets if we do?

Probably not, but there's a problem with %p. While it is specified by
C90 and almost certainly implemented in the C library of all systems
we care about, it is implemented how exactly the pointer will be
printed. On OpenBSD and Linux it is something like 0xNNNNNNNN, but
Solaris generates NNNNNNNN (without the initial 0x). That's
undesirable I think.

An option would be to use the strategy used by phex_nz() to print host
addresses. Or we could use PRINTF_HAS_LONG_LONG, and always use %llx
if it's available.

I'd really like to avoid introducing another macro dealing with
type-size issues if possible. I especially dislike HOST_IS_LLP64
since I fear its existence encourages people to write unportable code.