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