[Eug-lug] LP64
Jacob Meuser
jakemsr at jakemsr.com
Sun Jan 9 00:35:36 PST 2005
On Sun, Jan 09, 2005 at 12:14:13AM -0800, Neil Parker wrote:
> Jacob Meuser wrote,
> >so I got an amd64 mobo (ASUS KV8 SE Deluxe) and 3000+ CPU.
> >
> >now, I've got a programming question ;)
> >
> >If there's code that does
> >
> > void *data;
> > ...
> > data = (void*)open(...);
> >
> >would it be "fixed" by adding a intptr_t cast?
> >
> > void *data;
> > ...
> > data = (void*)(intptr_t)open(...);
> >
> >it shuts gcc up anyway.
> >
> >where is intptr_t defined on GNU/Linux? it's in <inttypes.h> on
> >OpenBSD.
>
> OK, that's officially weird.
>
> The correct way to fix that code is probably like this:
>
> int data;
> ...
> data = open(...);
yes.
> Remember, open() returns an int (specifically, the file descriptor of the
> file that you just opened).
yes
> I can think of no sensible reason to cast it to
> a pointer--it will never point to anything useful, and deferencing it will
> probably earn you an immediate trip to the land of segmentation violation.
>
> And on an LP64 compiler, casting to a pointer is just plain wrong--ints and
> pointers aren't the same size anymore, and you don't want to shut gcc up,
> because it's trying to tell you something important.
the thing is, there's also a foo_open function, that returns a
pointer to a struct. the code was apparently written to make
open and ibp_open interchangable. since they have different
return types, the author chose to use (void *). the only use
of data is "if(!data) { ... }".
--
<jakemsr at jakmesr.com>
More information about the EUGLUG
mailing list