Michael David Crawford
2009-May-22 09:30 UTC
[Xen-devel] Casting 64-bit pointers to integers
In building on my 64-bit Xeon box, I see a lot of warnings about casting between pointers and integers of different sizes. Sometimes it can cause fatal compiler error. Is there a reasonably portable way to make such casts? The conventional wisdom is that ints are supposed to be the natural machine word size. But even that isn''t always the case - much gnashing of teeth resulted in the two most popular compilers for the 68000 Macintosh having different int sizes. There are typedefs for integers with specific numbers of bits, but that''s not what we want. If we''re building for 32-bit, we want a 32-bit integer, and if we''re building for 64-bit, we want a 64-bit integer. Is there any kind of standardized integer type which is guaranteed to be the same size as a pointer? What might even be worse is that the mismatch is on purpose for some reason, say that some structure has a field that simply *must* be 32-bits, but we''re trying to wedge a 64-bit pointer into it. Mike -- Michael David Crawford mdc@prgmr.com prgmr.com - We Don''t Assume You Are Stupid. Xen-Powered Virtual Private Servers: http://prgmr.com/xen _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Michael David Crawford, le Fri 22 May 2009 02:30:35 -0700, a écrit :> There are typedefs for integers with specific numbers of bits, but > that''s not what we want. If we''re building for 32-bit, we want a 32-bit > integer, and if we''re building for 64-bit, we want a 64-bit integer.intptr_t/uintptr_t is there for this. Samuel _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Michael David Crawford
2009-May-22 09:53 UTC
Re: [Xen-devel] Casting 64-bit pointers to integers
Samuel Thibault wrote:> intptr_t/uintptr_t is there for this.In tools/xenpmd/acpi-events.c, which is in the git sources but doesn''t seem to be in the 3.4 sources, there are two returns from acpi_events_thread which cast ints to void*''s. These break the compile on 64-bit. One of the ints is a socket_fd, the other is the result from a connect system call. I got it to compile at first by doing something like this: return (void*)(unsigned long long)socket_fd But what would be better is return (void*)(uintptr_t)socket_fd If you were to just make socket_fd a uintptr_t, it would lose precision when you passed it to connect. You could explicitly cast it to an int there, I suppose. Mike -- Michael David Crawford mdc@prgmr.com prgmr.com - We Don''t Assume You Are Stupid. Xen-Powered Virtual Private Servers: http://prgmr.com/xen _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Michael David Crawford, le Fri 22 May 2009 02:53:38 -0700, a écrit :> But what would be better is > > return (void*)(uintptr_t)socket_fdYes, that''s the correct way. Samuel _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel