www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - A bug due to negating object.sizeof

There has been two threads about signed/unsigned recently on the main D 
forum, especially on the size_t and sizediff_t aliases. This is not 
directly related to those aliases but here is a fresh bug of mine. The 
following code attempts to point at the ID3v1 block from the end of an 
mp3 file:

     dosya.seek(-ID3v1Pakedi.sizeof, SEEK_END);

Although there is a bug, it works on my 64-bit Linux environment. 
Fortunately, it failed on a Windows system when compiled with the 32-bit 
dmd 2.057.

Since .sizeof is unsigned, negating it produces a very large unsigned 
value, which goes through to!int in std.stdio.File.seek. That conversion 
works fine on my 64-bit environment and the program works as expected, 
but it fails on that Windows system with the following exception:

   std.conv.ConvOverflowException std\conv.d(1302): Conversion positive 

Yes, the code is buggy and my fix is the following (although not tested 
on Windows yet! :p):

     dosya.seek(-cast(long)ID3v1Pakedi.sizeof, SEEK_END);

Just throwing it out there as a reminder...

Jan 25 2012