Memory allocation purity

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Tue May 20 13:34:55 PDT 2014


On Mon, 19 May 2014 18:46:22 -0400, Dicebot <public at dicebot.lv> wrote:

> On Monday, 19 May 2014 at 20:51:22 UTC, Steven Schveighoffer wrote:
>> On Mon, 19 May 2014 16:23:34 -0400, Dicebot <public at dicebot.lv> wrote:

>>> Oh, and are probably eager to show me links to specs which indicate  
>>> what part of my snippet breaks the type system? Is it allocation that  
>>> is forbidden in reasonable code? Or object identity?
>>
>> None is forbidden, and the combination above is a BUG. Bugs happen,  
>> compilers actually compile them. pure != bug-free.
>
> No it is not. It is semantically valid code which does exactly what it  
> was expected to do. Unless compiler optimization happens which will  
> actually introduce a bug silently. It is optimization that is broken,  
> not code itself.

Again, the bug is to break if a function that allocates an immutable  
object for some reason re-uses the immutable object (perfectly legitimate  
optimization, whether done by the compiler or intentionally).

I still have not seen the code that somehow can't handle this.

> And this is not some sort of imaginary code. `alloc` implementation may  
> be located in some other static library and not available to compiler.  
> It is likely to be not a plain `alloc` in real code but some utility  
> function that creates and returns object internally.

alloc isn't the problem. oops is incorrectly implemented to depend on  
implementation details of the allocator.

>>> Please stop this "write proper code" absurdism. This code is safe,  
>>> doesn't use casts or pointer forging or any other dirty low level  
>>> tricks. If compiler can't reject it as invalid and goes into funny  
>>> mode instead, compiler is fucked. There can be no excuse for it.
>>
>> The code above relies on implementation details of the allocator to do  
>> it's work. It's invalid to do so.
>
> Wrong again. It does not rely upon anything. It simply checks if two  
> objects returned by two functions calls are identical. With zero  
> assumptions about it.

Then why is oops returning true a failure case?

>> Please show me the code that goes into "funny land" because of an  
>> incorrect result of oops.
>
> What the hell are you speaking about? Getting two different results for  
> a function depending on -O flag is not weird enough for you?

It's not unheard of. When you violate language assumptions, it happens.  
I've seen code that breaks when -O is passed, vs. when it's not.

> - Hey, this program produces a wrong output!
> - But it doesn't wipe your system. You will be fine.

This is a superficial reading of my statement ;)

>
> At this point it is hard to believe you are serious and not trolling.

Yeah, it was kind of trolling, but I keep asking questions and have been  
given the same irrelevant answers. Sorry.

-Steve


More information about the Digitalmars-d mailing list