На границе FFI C-функции передали указатель, полученный из изменяемой ссылки. Какое поведение C-кода сохраняет инвариант уникального доступа Rust?
База Hintsage
Unsafe и память
Unsafe Rust, raw pointers, FFI и инварианты безопасности.
Практика
Вопросы: Unsafe и память
Сценарий: FFI возвращает указатель на буфер и его длину. Что нужно доказать перед созданием из них Rust-среза?
Что именно гарантирует компилятор Rust, когда разыменование raw pointer помещено в unsafe-блок?
Кому должна быть возвращена память, выделенная Rust и переданная через FFI в виде raw pointer?
Какие последствия возникают, если паника Rust пересекает границу функции с ABI C?
Разберите, какие дополнительные инварианты возникают в момент превращения raw pointer в ссылку Rust.
При передаче структуры Rust в C какое представление нужно выбрать, чтобы C корректно использовал смещения её полей?
Объясните, чем опасен для C callback Rust с совпадающей сигнатурой, но обычным Rust ABI?
Как unsafe extern определяет место проверки контракта безопасности при вызове FFI-функции?
Какой инвариант делает чтение значения через raw pointer некорректным, даже если адрес охватывает достаточно байт?
На каком условии можно безопасно представить значение C-перечисления как Rust enum на границе FFI?
Указатель из FFI адресует достаточно большой участок памяти, но его адрес не кратен выравниванию типа. Допустимо ли разыменовать такой raw pointer и чем заменить операцию?
Представьте вызов C-функции, которая записывает результат по переданному указателю. Как Rust должен представить такой выходной параметр до вызова, чтобы не считать память инициализированной преждевременно?
Разберите обращение к элементу за пределами выделенного массива: какой инвариант нарушается уже при вычислении q?
fn main() {
let data = Box::new([10u8, 20, 30]);
let p = data.as_ptr();
let q = unsafe { p.add(4) };
println!("{}", unsafe { *q });
}
Достаточно ли совпадения числового адреса для разыменования указателя, восстановленного из usize?
Объясните механизм, благодаря которому UnsafeCell<T> разрешает внутреннюю изменяемость без снятия всех правил алиасинга Rust.
Внешняя библиотека сохраняет переданный ей указатель после возврата функции. Какой инвариант должен обеспечить Rust-код, чтобы последующее обращение по нему оставалось корректным?
Какой инвариант доступа делает запись через raw pointer из другого потока безопасной?
Каким условием безопасная обёртка над FFI-вызовом может скрыть unsafe от вызывающего кода Rust?
При передаче текста из Rust в C какой инвариант требуется сохранить, чтобы чтение до нулевого байта не вышло за границы объекта?
Показано 1–20 из 50