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.