ubyte array changing values between calls? Possible bug?

Gary Willoughby dev at nomad.so
Sun Dec 15 04:52:32 PST 2013


On Sunday, 15 December 2013 at 00:21:37 UTC, Ali Çehreli wrote:
> On 12/14/2013 10:48 AM, Gary Willoughby wrote:
>
> > On Friday, 13 December 2013 at 17:35:27 UTC, John Colvin
> wrote:
>
> >>>     public void opAssign(uint value)
> >>>     {
> >>>         this._octets = value.nativeToBigEndian();
> >>>         assert(this._octets == [1, 2, 3, 4]);
> >>>     }
> >>> }
>
> >> opAssign is escaping a reference to its stack by assigning
> the static
> >> array to the slice _octets. Therefore, garbage.
> >
> > I'm not going to lie that has gone over my head a little.
> Could you
> > explain it more simply please? I just want to totally
> understand the
> > issue here. Thanks.
>
> According to documentation, nativeToBigEndian returns a static 
> array (fixed-length array):
>
>   http://dlang.org/phobos/std_bitmanip.html#.nativeToBigEndian
>
> It says "returns it as a ubyte[n] where n is the size of the 
> given type."
>
> Since static arrays normally live on the stack, the returned 
> array is a local array.
>
> As with any slice assignment, the assignment to this._octets in 
> opAssign makes _octets a slice to the elements of that local 
> array. Upon leaving opAssign that array is no more. So, _octets 
> is left referring to elements that are long gone. :(
>
> Ali

Ah right, that now makes perfect sense. Thanks all! :)


More information about the Digitalmars-d-learn mailing list