ubyte array changing values between calls? Possible bug?

Rémy Mouëza remy.moueza at gmail.com
Fri Dec 13 10:01:51 PST 2013


It works fine when using dup to the value returned by nativeToBigEndian:
     public void opAssign(uint value)
     {
         this._octets = value.nativeToBigEndian().dup;
         assert(this._octets == cast (ubyte[]) [1, 2, 3, 4]);
     }



On 12/13/2013 06:35 PM, John Colvin wrote:
> On Friday, 13 December 2013 at 16:37:51 UTC, Gary Willoughby wrote:
>> I have the following code which is massively simplified from a larger
>> type. The problem occurs between assigning the value to the type and
>> retrieving it.
>>
>> The value is assigned through opAssign and the assert passes. When
>> using a property to retrieve the same data the assert fails!
>>
>> import std.bitmanip;
>> import std.stdio;
>> import std.traits;
>>
>> struct IpAddress
>> {
>>     private ubyte[] _octets;
>>
>>     this(uint value)
>>     {
>>         this.opAssign(value);
>>     }
>>
>>     public @property ubyte[] data()
>>     {
>>         assert(this._octets == [1, 2, 3, 4]);
>>         return this._octets;
>>     }
>>
>>     public void opAssign(uint value)
>>     {
>>         this._octets = value.nativeToBigEndian();
>>         assert(this._octets == [1, 2, 3, 4]);
>>     }
>> }
>>
>> unittest
>> {
>>     auto ipAddress = IpAddress(0x01020304);
>>     assert(ipAddress.data == [1, 2, 3, 4]);
>> }
>>
>> Any ideas why?
>>
>> On a side note i also expected nativeToBigEndian to byte flip the hex
>> literal, no idea why it hasn't, it's been a long day... I'm using
>> MacOSX (Intel).
>>
>> Compiled with: rdmd --force -de -debug -main -property -unittest -w
>> file.d
>
> opAssign is escaping a reference to its stack by assigning the static
> array to the slice _octets. Therefore, garbage.



More information about the Digitalmars-d-learn mailing list