Thread overview
[Issue 4593] New: (DMD 2.047) std.string.split + unittest build = Access Violation
Aug 07, 2010
Adrian Matoga
[Issue 4593] (DMD 2.047) Access Violation in unittest build
Aug 07, 2010
Andrej Mitrovic
Aug 07, 2010
Adrian Matoga
Aug 07, 2010
Andrej Mitrovic
Aug 07, 2010
Adrian Matoga
Aug 07, 2010
Andrej Mitrovic
Aug 11, 2010
Adrian Matoga
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4593

           Summary: (DMD 2.047) std.string.split + unittest build = Access
                    Violation
           Product: D
           Version: D2
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: epi@atari8.info


--- Comment #0 from Adrian Matoga <epi@atari8.info> 2010-08-07 08:14:50 PDT ---
Hi,

I encountered a strange problem that appears when I build my project with
-unittest switch on.
The executable fails giving a message "object.Error: Access Violation",
despite that without "-unittest" it works correctly.

I tried to successively cut different parts of code to find a source of problem, and I came up with an example which may be close to a minimal one. It consists of two files, "a.d":

-------------------------
import std.string;
import std.stdio;

static string foo(string path)
{
    auto strs = path.split(".");
    return strs.length ? strs[$ - 1] : "";
}
-------------------------

and "b.d":

-------------------------
import std.stdio;
import a;

void main()
{
    writeln("Hello, world!");
}
-------------------------


Compile it using:
dmd -oftest.exe -unittest a.d b.d

and then launch it, and you'll see the "Access violation" message.
However, when you drop -unittest switch, or replace `path.split(".")' with, for
example, `[ "" ]', or merge both sources together into a single source file,
the program displays "Hello, world!" as expected.

I have no idea what could be the actual source of problem, but I hope the example can help fixing it.

Regards,
Adrian Matoga

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4593


Andrej Mitrovic <andrej.mitrovich@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrovich@gmail.com


--- Comment #1 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2010-08-07 11:32:05 PDT ---
I can't reproduce this on XP SP3, the output is fine for me:

b.d
--------------------------------
import std.stdio;
import a;

void main()
{
    writeln("Hello, world!");
    writeln(foo("some.path"));
}
--------------------------------

a.d
--------------------------------
import std.string;
import std.stdio;

static string foo(string path)
{
    auto strs = path.split(".");
    return strs.length ? strs[$ - 1] : "";
}
--------------------------------

C:\Test>dmd -oftest.exe -unittest a.d b.d

C:\Test>test
Hello, world!
path

Same thing when using a unittest block in b.d.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4593


Adrian Matoga <epi@atari8.info> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Platform|Other                       |x86_64


--- Comment #2 from Adrian Matoga <epi@atari8.info> 2010-08-07 12:47:35 PDT ---
Mhm, on XP SP3 it works fine for me also. But on Win7 (x86_64)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4593



--- Comment #3 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2010-08-07 12:50:29 PDT ---
I'm not sure if DMD is fully supported on x64 yet(?)

Someone else will have to fill in.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4593



--- Comment #4 from Adrian Matoga <epi@atari8.info> 2010-08-07 13:44:35 PDT ---
Hmm, this seems to be a lot more subtle thing.

Could you try the following:

image.d:
--------------------
import std.string;
import std.contracts;
import std.conv;

interface Image
{
    static Image open(string path, string type, bool readOnly = true)
    {
        auto img = newObj(path, type);
        img.openImpl(path, readOnly);
        return img;
    }

    static Image open(string path, bool readOnly = true)
    {
        return open(path, autoType(path), readOnly);
    }

protected:
    void openImpl(string path, bool readOnly);

private:
    static Image newObj(string path, string type)
    {
        auto image = cast(Image) Object.factory(tolower(type) ~ "." ~
capitalize(type) ~ "Image");
        version (unittest)
        {
            if (image is null)
                image = cast(Image) Object.factory("image." ~ capitalize(type)
~ "Image");
        }
        enforce(image, "Unknown image format: " ~ type);
        return image;
    }

    static string autoType(string path)
    {
        auto sp = path.split(".");
        return sp.length ? sp[$ - 1] : "";
    }
}
--------------------

main.d
--------------------
import std.stdio;

void main()
{
    writeln("Hello world!");
}
--------------------

dmd -oftest.exe -unittest main.d image.d

For me, this also fails on XP SP3 (x86).

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4593



--- Comment #5 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2010-08-07 14:00:10 PDT ---
You forgot to put an import to image in main.d . Without it, I'll get that object error thing. Otherwise, this will work fine:

import image;
import std.stdio;

void main()
{
   writeln("Hello world!");
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 11, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4593


Adrian Matoga <epi@atari8.info> changed:

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


--- Comment #6 from Adrian Matoga <epi@atari8.info> 2010-08-11 04:54:30 PDT ---
Seems like it's fixed now with 2.048.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------