there are things that you either
can't express, or are very hard
to express, in safe Rust.
This is true (and in some sense inevitable by Rice's theorem) but it is unclear what can be done about this. Bear in
mind that Rust's design constraints are- decidable (indeed fast) type-inference/type-checking
- simple typing system
- you don't pay for features you don't use
It is easy to get rid of unsafe blocks if you throw complexity at Rust, e.g. use dependent types and / or theorem provers, but all the obvious ways of doing this immediately violate the constraints above. Doing it within Rust's constraints is an open research problem.
potentially fixable.
What would you use as an objective, measurable criterion that we can
use to decided whether a purposed fix is in fact a fix? If you have a
concrete design proposal that works (in particular w/o destroying
Rust's fast (bidirectional) type-inference/type-checking and the
simplicity of Rust's types), and evidence that it's widely applicable
(i.e. doesn't just allow to type some trivial edge cases of back-links
and partially initialised arrays) that would easily publishable in top
PL conferences (e.g. POPL) and a working prototype would help towards
getting this into Rust.I would be happy to help with implementing & writing up such work. I have quite a bit of experience with sub-structural types a la Rust. I have spend some time thinking about this problem space, but didn't manage to crack it. I have an incoming PhD student whom I could ask to help with this.