On Monday, 30 May 2016 at 10:55:57 UTC, Marc Schütz wrote:
On Sunday, 29 May 2016 at 14:27:51 UTC, Nick Treleaven wrote:
What about if the RCArray (of ref count 1) is assigned to a different one after the local ref is initialised? That is what we're discussing -it's your example above(!)

Exactly, and then one of the two suggested approaches will have to be used to prevent the use-after-free. But that's something that needs to happen on assignment, not when the reference is created.

Well my solution does work, disallowing the problematic local refs. But it wouldn't be great for generic code or consistency with the @rc DIP. For the latter, we can add a temporary RC object to keep the referenced memory alive, but we only need to do this when the local ref is initialized from a function both (1) returning ref and (2) with a parameter marked return.

I think we should just prevent front from escaping.

It doesn't necessarily need to escape for the problem to occur. Well, it does in this example, but it can be trivially rewritten:

    auto tmp = stdin.byLine;
    auto lines = tmp.array;

Here, `lines` contains references to the buffer owned by `tmp`, but doesn't escape (assuming `array` takes its argument by `scope` or however the final solution will look like).

tmp and stdin.byLine are of type ByLine, whose front could be scope/return to prevent escaping. Above array() does escape ByLine.front so can't mark its argument with scope - the compiler would error.

Reply via email to