22-Mar-2013 11:26, Jacob Carlborg пишет:
On 2013-03-21 22:46, Iain Buclaw wrote:
On 21 March 2013 20:29, Jacob Carlborg <[email protected]
<mailto:[email protected]>> wrote:

    The code below works fine without optimizations. But with
    optimizations (the -O flag) turned on it segfaults. The behavior
    with optimizations turned on is a bit different depending on which
    version of DMD I try and if I compile for 32 or 64bit.

    DMD 2.062 64bit: Segfault
    DMD 2.062 32bit: Prints a huge array then segfault
    DMD 2.061 64bit: Segfault
    DMD 2.061 32bit: Prints a fairly small array (10 elements) with
    random numbers
    DMD head (7dcc72a997) 32bit: Bus error: 10

    I'm using Mac OS X 10.8.2.

    import std.stdio;

    int[]* getDeserializedSlice ()
    {
         void[] a = [1, 2, 3, 4, 5].dup;
         auto b = &a;

         if (auto c = b)
             auto d = &(cast(int[]) *c)[1 .. 1 + 2];

         return null;
    }

    void main ()
    {
         writeln(*getDeserializedSlice(__));
    }

    Is the above code supposed to work? The test case might look a bit
    strange, the full source code is here:


https://github.com/jacob-__carlborg/orange/blob/master/__orange/serialization/__Serializer.d#L1672


<https://github.com/jacob-carlborg/orange/blob/master/orange/serialization/Serializer.d#L1672>


    --
    /Jacob Carlborg

Crap, that example was incorrect, it should look like this:

return &(cast(int[]) *c)[1 .. 1 + 2];

OK so c points to [1, 2, 3, 4, 5] (and who knows if it's 5 bytes or 5 ints) slice. *c is that slice, (cast(int[])*c)[1..3] is pieces of that slice an r-value. Mmm so you are returning a pointer to r-value (a local temporary)? What's the point of the code?

--
Dmitry Olshansky

Reply via email to