ubyte array changing values between calls? Possible bug?

Gary Willoughby dev at nomad.so
Sat Dec 14 10:48:16 PST 2013


On Friday, 13 December 2013 at 17:35:27 UTC, 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.

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.


More information about the Digitalmars-d-learn mailing list