On Monday, 2 May 2016 at 20:05:15 UTC, Steven Schveighoffer wrote:
On 5/2/16 3:38 PM, Namespace wrote:
The assembler might be safe in some instances, but that doesn't reflect the original internal representation in the compiler. Some other configuration of calls may allow the compiler to reuse that
memory, and then you run into problems.

I'm wondering if you used my rewrite if it would actually output the
same thing?

Not quite. Look for yourself:
https://godbolt.org/g/kO8hdW
https://godbolt.org/g/KCfYPy

Except for offsets, it looks identical. May be the compiler puts things in different spots for different ways of writing.

But the thing that's not disclosed here is: what happens when the compiler feels the need to reuse that stack space? Your example doesn't have anything that may compete for the space, it just returns after this is over.

For example, define a static array of exactly the same size to use after the call:

int[3] x;

Now, see if x is pigeonholed into that same place your temporary return existed (and therefore 'as' points at it).

I'm still fully on the side of this being unsafe.

-Steve

I used it very often, but always assigned the result to an auto-type variable, never to a slice.

Reply via email to