Date: Thu, 18 Sep 2008 17:38:47 -0400 From: John Baldwin <jhb@freebsd.org> To: freebsd-hackers@freebsd.org Cc: stevefranks@ieee.org, Lowell Gilbert <freebsd-bugs@be-well.ilk.org> Subject: Re: proper types for printf()-ing pointers on amd64 that won't break Message-ID: <200809181738.47248.jhb@freebsd.org> In-Reply-To: <448wtpb98s.fsf@be-well.ilk.org> References: <539c60b90809181041n658d2823y89e42bb0ccfa6d06@mail.gmail.com> <448wtpb98s.fsf@be-well.ilk.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 18 September 2008 02:26:59 pm Lowell Gilbert wrote: > "Steve Franks" <stevefranks@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. -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809181738.47248.jhb>