Re: Two decades
You're really over-egging the Rust thing, sorry.
Rust just makes you put unsafe code inside an unsafe declaration - it does nothing to stop it happening. And code inside unsafe can destroy the guarantees of surrounding safe blocks.
But the biggest problem - there are some things which are IMPOSSIBLE to do outside an unsafe declaration - many of them at the system layer (like device drivers, DMA, bus interfacing, self-modifying code, etc. etc. etc.).
Just writing something in Rust doesn't fix it. It just means that you put a nice little warning cone around the potentially-dodgy statements. That's all it does. It doesn't do anything about AVOIDING THE NEED for those unsafe statements.
Literally anything that assumes the values or bounds referenced in a piece of arbitrary memory (i.e. every hardware interface like USB, PCI, etc.) is "unsafe". Basically anything that you'd use a pointer derefernece or casting for in C code. You can't write a device driver for 99% of modern hardware in "safe"-statements-only Rust. It's simply not possible.
All it is in a warning cone, like "Wet Floor". That's it. And you can't just avoid having to mop your floors.
Applications - yes, slightly different. Most applications do not need such functionality (but not all!).
However at an OS level, there is no avoiding unsafe code, and the only difference between C and Rust is that Rust puts a little warning cone over it. You can still screw up the OS and get compromised by it, and it can even break your "safe" code that's nearby (memory-wise, not necessarily source-code-wise).