Thread overview
[Issue 1219] New: long.max.stringof gets corrupted
May 07, 2007
d-bugmail
May 07, 2007
d-bugmail
May 07, 2007
Don Clugston
Jul 01, 2007
d-bugmail
May 07, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1219

           Summary: long.max.stringof gets corrupted
           Product: D
           Version: 1.014
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Keywords: wrong-code
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla@digitalmars.com
        ReportedBy: fvbommel@wxs.nl


See the comments for stuff that makes the problem go away:
---
import std.stdio;
import std.string;

// "Manually" instantiating this template function (changing it into
// a regular function with void[0] argument) makes the problem disappear.
void foo(T)(T t) {
    /*
    // It even fails if this is put in (so below code isn't reached).
    return null;
    //*/

    // It works if this is removed:
    static if (is(typeof(T.nonexistant)))
    {}
}

void main() {
    /*
    // Shows that long.max.stringof is wrong:
    writefln(long.max);
    writefln(long.max.stringof);
    //*/

    /*
    // Shows the problem more exactly:
    // (namely, the first 2 bytes of long.max.stringof are wrong)
    foreach(char c; format(long.max)) {
            writef("%02x ", c);
    }
    writefln();
    foreach(char c; long.max.stringof) {
            writef("%02x ", c);
    }
    writefln();
    //*/

    assert(long.max.stringof == format(long.max));      // fails

    // Remove this or change the argument to something
    // other than a static array and it works.
    foo([]);
}
---


-- 

May 07, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1219





------- Comment #1 from fvbommel@wxs.nl  2007-05-07 09:42 -------
Another interesting case, likely related:
---
import std.stdio;
import std.string;

void main() {
    writefln(long.max.stringof);
    writefln(ulong.max.stringof);
}
---
The first three bytes of long.max.stringof seem to be overwritten by "-1\0".
ulong.max.stringof is incorrectly displayed as "-1".
If you change the order, the first three characters of long.max.stringof
overwrite the characters of ulong.max.stringof (including the trailing \0).


-- 

May 07, 2007
d-bugmail@puremagic.com wrote:
> http://d.puremagic.com/issues/show_bug.cgi?id=1219
> 
> 
> 
> 
> 
> ------- Comment #1 from fvbommel@wxs.nl  2007-05-07 09:42 -------
> Another interesting case, likely related:
> ---
> import std.stdio;
> import std.string;
> 
> void main() {
>     writefln(long.max.stringof);
>     writefln(ulong.max.stringof);
> }
> ---
> The first three bytes of long.max.stringof seem to be overwritten by "-1\0".
> ulong.max.stringof is incorrectly displayed as "-1".
> If you change the order, the first three characters of long.max.stringof
> overwrite the characters of ulong.max.stringof (including the trailing \0).

I've seen similar things, and I think it is related to the ".". It can happen to floating-point numbers as well, when they contain a decimal point.

July 01, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1219


bugzilla@digitalmars.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED




------- Comment #3 from bugzilla@digitalmars.com  2007-07-01 14:02 -------
Fixed DMD 1.018 and DMD 2.002


--