Phobos is now compiled with -preview=dip1000

Meta jared771 at gmail.com
Fri May 17 21:57:51 UTC 2019


On Friday, 17 May 2019 at 20:59:43 UTC, Mike Franklin wrote:
> On Friday, 17 May 2019 at 17:03:51 UTC, Meta wrote:
>
>> If you look at `main` above, `rawData` has the same lifetime 
>> as the `dataRange` struct returned from `makeDataRange` and 
>> the queue returned from `copyToQueue`. True, there is some 
>> traditionally unsafe stuff happening in between; however, I 
>> thought that the point of adding all these annotations is to 
>> tell the compiler how the lifetimes of these objects propagate 
>> up and down the call stack, so that it can check that there 
>> will be no memory corruption. I'm not doing anything here that 
>> will result in a pointer to an expired stack frame, or 
>> otherwise cause memory corruption or use after free, or 
>> anything like that (*unless* I allow either `dataRange` or 
>> `result` to escape from the main function - which dip1000 
>> correctly disallows).
>
> I don't think it does because `Queue!(T).store` has infinite 
> lifetime beyond that of even `main`, at least as far as the 
> compiler is concerned.

I see what you're getting at. The compiler sees a slice type 
(i.e., Data[]), knows that it's GC-backed and thus has infinite 
lifetime, and concludes "the data you're trying to put in the 
store has too long of a lifetime". That makes sense, but slices 
don't necessarily have to be backed by the GC, so that seems like 
a faulty heuristic to me and possibly a vector for bugs.

> The compiler doesn't have enough information to know that 
> `store` is tied to the lifetime of `Queue!(T)` (a.k.a 
> `rawData`) and maybe that's a missing language feature.

According to the DIP, "from a lifetime analysis viewpoint, a 
struct is considered a juxtaposition of its direct members." Who 
knows if that's still the case, because Walter has considerably 
changed how it works but has not documented those changes (IIRC, 
I may be wrong on that). That probably means that a Queue!T has 
an infinite lifetime, assuming that the compiler sees its T[] 
member as having an infinite lifetime.

> Maybe we should be allowed to declare aggregate fields as 
> `scope` to convey that, but the compiler currently disallows it.

That might be nice but would also probably cause a dramatic 
increase in complexity. I haven't thought through the possible 
ramifications of making a change like that.




More information about the Digitalmars-d-announce mailing list