A bug due to negating object.sizeof
Ali Çehreli
acehreli at yahoo.com
Wed Jan 25 11:43:03 PST 2012
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 at 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
More information about the Digitalmars-d-learn
mailing list