Am 24.02.2011 08:21, schrieb Markus Armbruster: > Stefan Weil <w...@mail.berlios.de> writes: > >> Here the int values fds[0], sigfd, s, sock and fd are converted >> to void pointers which are later converted back to an int value. >> >> These conversions should always use intptr_t instead of unsigned long. >> >> They are needed for environments where sizeof(long) != sizeof(void *). > > To be precise: when you want to cast a pointer to a signed integer type > and back without loss, intptr_t is the signed integer type to use. > > But here we're dealing with the opposite case: cast int to pointer and > back. > >> Signed-off-by: Stefan Weil <w...@mail.berlios.de> >> --- >> cpus.c | 8 ++++---- >> migration-tcp.c | 4 ++-- >> migration-unix.c | 4 ++-- >> qemu-char.c | 4 ++-- >> 4 files changed, 10 insertions(+), 10 deletions(-) >> >> diff --git a/cpus.c b/cpus.c >> index 0f33945..3c4e1b8 100644 >> --- a/cpus.c >> +++ b/cpus.c >> @@ -267,7 +267,7 @@ static void qemu_event_increment(void) >> >> static void qemu_event_read(void *opaque) >> { >> - int fd = (unsigned long)opaque; >> + int fd = (intptr_t)opaque; >> ssize_t len; >> char buffer[512]; >> > > Why can't you cast straight to int?
You would get warnings about a pointer being cast to an integer of different size (the behaviour is undefined if the integer is too small). I think you might also get a warning for the opposite direction. Kevin