Not disagreeing with you, but a nullptr-to-reference cast would at least crash immediately (unless you have a compiler that takes "undefined behavior" too literally). Here's another contrived example:
const char *c = std::string("oops").c_str();
I'm not a c++ expert but I'm pretty sure 'c' now points to freed memory. The real problem is that the code will usually work until a customer runs it. And solutions like valgrind aren't always optimal (consider code coverage and execution speed) or even necessarily available, depending on your platform.
Rust eliminates this class of errors (and several others) entirely, unless you are abusing 'unsafe' (which you can at least grep for in your code) as you mentioned.
I would like Rust to succeed. In several ways, it is basically a 'better' C++ without the C baggage that a lot of people seem to want, and it is clear that Rust's developers have put a lot of thought into it. Still, the language has its warts and oddities. My biggest concern is that support for implementing intrusive data structures (you can Google that, but the Linux kernel's double-linked lists is an example) seemed to be possible, but not Easy, and I think it should be. I also haven't wrapped my head around Rust's lifetimes yet, but it looks clunky. Other things (slow compiler, incomplete library support) should get better with time.
I wish the Rust guys the best of luck, and look forward to using it.