[Kde-bindings] Fwd: Qyoto/Kimono: A 64 bit unsafe function, build trouble on Debian unstable

Arno Rehn arno at arnorehn.de
Sun May 27 13:25:47 UTC 2007


Am Mittwoch, 23. Mai 2007 schrieb Richard Dale:
> On Tuesday 22 May 2007, Arno Rehn wrote:
> > > [  2%] Building CXX object CMakeFiles/qyoto.dir/src/qyoto.o
> > > /home/kaare/source/qyoto/src/qyoto.cpp: In function 'long int
> > > QyotoHash(void*)':
> > > /home/kaare/source/qyoto/src/qyoto.cpp:1706: error: cast from 'void*'
> > > to 'int' loses precision
> > > make[2]: *** [CMakeFiles/qyoto.dir/src/qyoto.o] Error 1
> > > make[1]: *** [CMakeFiles/qyoto.dir/all] Error 2
> > > make: *** [all] Error 2
> > >
> > > To solve the above problem, I changed the two instances of "return
> > > (int)" to "return (long)" in the QyotoHash() function.  However, I
> > > haven't examined whether this change is correct, as I have next to no
> > > C++ experience.
> >
> > Ah yes, it seems like we have to add a check whether void* is equal to
> > long or int.
>
> int
> QyotoHash(void * obj)
> {
> 	smokeqyoto_object *o = (smokeqyoto_object*) (*GetSmokeObject)(obj);
> 	(*FreeGCHandle)(obj);
>
> 	if (sizeof(void*) > sizeof(int)) {
> 		qint64 key = (qint64) o->ptr;
> 		return (int) ((key >> (8 * sizeof(int) - 1)) ^ key);
> 	} else {
> 		return (int) o->ptr;
> 	}
> }
>
> The code will work at runtime because on an EMT64T machine the test 'if
> (sizeof(void*) > sizeof(int))' will be true, and it won't go to the else
> part of the branch that the compiler is complaining about. So perhaps it
> should be some kind of macro instead where a similar condition is tested at
> compile time. Or can the cast be changed to keep the 64 bit compiler happy?
> It shouldn't be a long though - we want to return a 32 bit int on both 32
> bit and 64 bit machines.
Maybe we should drop the last part completely and always do
 		qint64 key = (qint64) o->ptr;
 		return (int) ((key >> (8 * sizeof(int) - 1)) ^ key);

Would that be possible?

-- 
Arno Rehn
arno at arnorehn.de



More information about the Kde-bindings mailing list