Weird bit-shift behavior on void*.

Jascha Wetzel firstname at mainia.de
Thu Aug 9 18:49:37 PDT 2007


C. Dunn wrote:
> I wish I could provide a testcase, but the problem is too weird:
> 
>     void* q = cast(void*)0x402A8000;
>     writefln("%x %x %d %d %x %x", q, v, q.sizeof, v.sizeof, (cast(size_t)q >> 48),(cast(size_t)v >> 48));
> 
> 'v' is a void* too. It is set during the program, and it is a real pointer address.  According to the output, q and v have the same value and the same data-type size:
>   402A8000 402A8000 4 4 0 402a
> (This output comes directly from the writefln as shown.)
> So why do they have different bit-shifted results?  The weird thing is, the bit-shift operand on 'v' is taken mod 32.  It gives '0' for 'v >> 32' and repeats the previous sequence up to 'v >> 64', etc.
> 
> But I cannot produce a testcase with this behavior because when I create a void* from the value of 'v' (e.g. 'q') I do not see the weird behavior.  The issue is not '>>' v. '>>>'; I've tried both.
> 
> The solution is to use (cast(ulong)v >> 48).  (Again, '>>' v. '>>>' makes no difference.)  Then I get:
>   402A8000 402A8000 4 4 0 0
> as expected.  But the cast(size_t) on 'q' works fine.
> 
> Does anyone have any idea what is going on here?  It is very magical, and it cost me a TON of debug time.

did you try looking at the code DMD generates (using obj2asm or a debugger)?



More information about the Digitalmars-d mailing list