Если разрешен код unsafe
, то:
fn main() {
unsafe { std::ptr::null_mut::<i32>().write(42) };
}
приводит к:
Compiling playground v0.0.1 (/playground)
Finished dev [unoptimized + debuginfo] target(s) in 1.37s
Running `target/debug/playground`
timeout: the monitored command dumped core
/playground/tools/entrypoint.sh: line 11: 7 Segmentation fault timeout --signal=KILL ${timeout} "$@"
, как показано на площадке .
Любая ситуация, которая может вызвать segfault, в какой-то момент потребует вызова неопределенного поведения. Компилятору разрешено оптимизировать код или иным образом использовать тот факт, что неопределенное поведение никогда не должно происходить, поэтому очень сложно гарантировать , что некоторый код будет иметь ошибку segfault. Компилятор вполне вправе заставить указанную выше программу запускаться без запуска segfault.
В качестве примера приведенный выше код при компиляции в режиме release вместо этого приводит к появлению «Недопустимой инструкции» .
Если код unsafe
не разрешен, см. Как Rust гарантирует безопасность памяти и предотвращает ошибки сегментации? , чтобы узнать, как Rust может гарантировать, что этого не произойдет, пока его инварианты безопасности памяти не нарушаются. (что могло произойти только в коде unsafe
).
Не используйте небезопасный код, если вы можете этого избежать.