proper types for printf()-ing pointers on amd64 that won't break
jhb at freebsd.org
Thu Sep 18 21:39:03 UTC 2008
On Thursday 18 September 2008 02:26:59 pm Lowell Gilbert wrote:
> "Steve Franks" <stevefranks at ieee.org> writes:
> > Hi,
> > I'm trying to correct some warnings in a port marked
> > ONLY_FOR_ARCHS=i386. They stem from casting a pointer (which I assume
> > is a 64-bit unsigned) to "unsigned int" which is apparently 32 bits?
> > I sort of thought int was supposed to be the atomic register size, but
> > no doubt that would break more than it would help, so it's 32-bits.
> > Anyways, what's the right way to fix this? The port actually works
> > fine as-is on amd64, so I can only assume something was fixed for 7.1,
> > or someone was being extra cautious with the i386 tag.
> > The code:
> > typedef unsigned int cardinal;
> > ...
> > fprintf(stderr, "Mode Table Offset: $C0000 + $%x\n",
> > ((cardinal)map->mode_table) - ((cardinal)map->bios_ptr));
> > Can I just ditch the cast+%x and use %p? I don't have an i386 system
> > to test on, and I don't want to break anything if I submit a patch...
> What is actually being printed isn't a pointer, but the difference
> between two pointers (I assume from your comments; the code included
> isn't enough to show where they come from). That means the correct
> type of what's being printed is size_t, which our printf seems to
> support with a "z" modifier. Removing the explicit casts or (if
> necessary), replacing them with something that is big enough will also
> be needed.
The difference of two pointers is actually a ptrdiff_t rather than a size_t.
size_t is what sizeof() returns.
More information about the freebsd-hackers