Небезопасный блок в Rust
Ключевое слово для такого участка пишут перед фигурными скобками. Внутри блока можно выполнять операции, которые в обычном коде запрещены, потому что компилятор не может доказать их безопасность.
За пределами скобок снова действуют все обычные правила: там нельзя, например, читать память по сырому адресу. Сам блок не делает программу целиком небезопасной, он лишь локально снимает часть проверок.
Возьмем живое локальное число, сохраним адрес в сыром указателе и прочитаем значение только внутри блока:
fn main() {
let x = 7;
let p: *const i32 = &x;
unsafe {
println!("{}", *p);
}
}
На экране появится 7. Создание
указателя из имени x здесь обычное,
а вот обращение к памяти по p
компилятор пропускает лишь внутри блока.
Тот же каркас подойдет для другого литерала, если переменная по-прежнему жива в этой области видимости:
fn main() {
let value = 15;
let addr: *const i32 = &value;
unsafe {
let copy = *addr;
println!("{}", copy);
}
}
Дано число:
let num = 9;
Объявите переменную с этим литералом, сохраните адрес в сыром указателе и выведите число, прочитав его только внутри небезопасного блока.
Дано число:
let num = 4;
Переменная n хранит этот литерал.
Скажите, где в программе можно прочитать
значение по указателю на n, а где
компилятор откажет в сборке.
Скажите, меняется ли ответственность автора для строк кода сразу после закрывающей скобки небезопасного блока.