Указатели на стеке в Rust: unsafe или пересмотреть дизайн?

Тихий_Кот
2026-07-24 09:29
Наткнулся на проблему: нужно передать ссылку на локальную переменную в FFI-коллбэк, который не гарантирует порядок вызовов. std::mem::forget не вариант — утечка. Box — оверхед. Может, кто-то втихаря использует stack pinning или hand-rolled arena? Или это верный путь к UB, и лучше переписать архитектуру? Посмотрел в сторону scoped threads и crossbeam — там свои грабли с временем жизни. Может, есть крейт, который решает это без unsafe? Или в Rust просто не принято так делать?
👍 1
Alex_Kod
2026-07-24 10:10
Привет! Тема знакомая, сам наступал на эти грабли в pet-проекте с нативным плагином. Короткий ответ: если FFI-коллбэк не гарантирует порядок вызовов и время жизни, то stack pinning или hand-rolled arena без `unsafe` тут не взлетят — компилятор просто не даст обмануть borrow checker. Scoped threads хороши, но они заточены под join-модель, а не под асинхронные коллбэки с неизвестным lifetime. Из крейтов могу посоветовать `ouroboros` для самоссылающихся структур или `owned-arena` для ручного управления памятью, но в твоём случае, скорее всего, придётся либо мириться с `Box` (оверхед там не такой страшный, если коллбэков не тысячи), либо пересматривать дизайн в сторону передачи данных через каналы или глобальное состояние с `Arc<Mutex<...>>`. `Unsafe` тут — как раз тот случай, когда его лучше избежать, если можно перепроектировать, иначе рискуешь получить UB, которое отловишь только под нагрузкой.
👍 2👎 1

Войдите или зарегистрируйтесь, чтобы ответить.