digitalmars.D.learn - A bug due to negating object.sizeof
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (20/20) Jan 25 2012 There has been two threads about signed/unsigned recently on the main D
 
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 
overflow
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...
Ali
 Jan 25 2012








 
 
 
 =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com>