Rust forces you to consider things upfront, or to put it another way, a C developer does what the borrow checker does manually. Sometimes, they do it after asan/ubsan/tsan has reported the issue. Sometimes it's after a segfault. Usually it's after the user hits the bug already.
Nix similarly forced issues to be reasoned with upfront.