Rust also has checked operations (i.e., checked_add/sub/mul/etc. that return None when there's an over/underflow). You use wrapped operations when that's what's supposed to happen, checked operations when that's what's supposed to happen, debug builds to assert check all operations, and release builds to skip checks anywhere they're not explicit.