Rust has features that look like equivalents of footguns in other languages, so it's easy to assume it can have the same failures.<p>For example, Rust has Option<String> that is a "nullable" string. missing.unwrap() will throw an exception or abort the program, just like a null pointer access would. You could think that a "bad programmer" will find these footguns and write just as bad code. But subtle differences in how these features work make a big difference in real-world use, even in the hands of careless programmers. A change between non-optional and optional is a type error that needs to be fixed everywhere. Option requires answering "what if it's empty" on <i>every use</i>, so a properly lazy programmer will avoid making things optional in the first place.<p>Rust also has good defaults. A struct type by default can't be copied, can't be compared, can't be serialized, can't be printed, can't be implicitly created from default values. The programmer is forced to think and explicitly write what can be done with the type. So users of a type can't carelessly copy a unique handle, or end up comparing addresses when they mean to compare values, <i>even if</i> the programmer writing the type forgot to consider these issues.