The only fool-proof solution is separate address spaces and OS cooperation.
I've only ever seen three reasons for Midori to shutdown:
1) they were hitting C# limitations (and started working on custom compilers etc) (and people involved in Midori say Rust has already shipped things they failed to do)
2) there was a bit too much academic overeagerness, e.g. software transactional memory will kill any project that attempts it
3) basically getting their budget taken away
https://www.zdnet.com/article/whatever-happened-to-microsoft...
[0]: https://learn.microsoft.com/en-us/previous-versions/dotnet/f...
[1]: https://learn.microsoft.com/en-us/dotnet/api/system.security...
[2]: https://learn.microsoft.com/en-us/dotnet/core/compatibility/...
I'd love to see someone put genuine thought into what it would take to say that e.g. a Rust crate has no ambient authority. No unsafe, applied transitively. For example, no calling std::fs::open, must pass in a "filesystem abstraction" for that to work.
I think the end of that road could be a way to have libraries that can only affect the outside world by values you pass in (=capabilities), busy looping, deadlocking, or running out of memory (and no_std might be a mechanism to force explicit use of an allocator, too).
(Whether that work is worth doing in a world with WASM+WASI is a different question.)