Вышел Rust 1.99.0: вариадические функции на C-ABI и работа со свойствами сырых указателей
Команда Rust объявила о выходе новой версии языка — 1.99.0. Обновиться можно командой rustup update stable; те, кто ещё не ставил rustup, найдут его на официальном сайте. Разработчиков также приглашают помогать с тестированием будущих релизов через beta- и nightly-каналы.
Вариадические функции с C-ABI
Главное нововведение — стабилизация определения вариадических функций с ABI "C" и "C-unwind". Такие функции принимают переменное число аргументов через список .... Раньше Rust умел лишь вызывать внешние вариадические функции (например, libc::printf), теперь же их можно писать на самом Rust.
Тип ... — это VaList, совместимый по ABI с сишным типом va_list на разных платформах. Какие типы можно читать из VaList, определяет трейт VaArgSafe. Отдельно стабилизирована поддержка «голых» (naked) вариадических функций с ABI, отличными от "C", — их приходится писать через встроенный ассемблер.
Свойства раскладки через сырые указатели
Релиз закрепляет требования безопасности для получения размера и выравнивания по сырым указателям — как для Sized-типов (что и раньше работало на стабильном канале), так и для типов без известного размера. Для этого стабилизированы Layout::for_value_raw, mem::size_of_val_raw и mem::align_of_val_raw.
Осторожнее с Box::leak
Семантика языка в 1.99 не менялась, но обновилась документация к Box::leak: теперь она рекомендует не применять приёмы, при которых утёкшая память впоследствии освобождается обратно. Выяснилось, что такой код плохо уживается с текущими и будущими оптимизациями компилятора и особенно опасен в свете грядущей стабилизации пользовательских аллокаторов. Вместо этого следует предпочитать Box::into_non_null; это касается и прочих функций «утечки» из стандартной библиотеки.
Стабилизированные API
Среди прочего в стабильный канал перешли реализации IntoIterator для Box<[T; N]> и ссылок на него, VecDeque::retain_back, core::ffi::VaList, пары Box::into_non_null/Box::from_non_null и Vec::into_parts/Vec::from_parts, String::from_utf8_lossy_owned, а также std::fs::set_times и set_times_nofollow.
Полный перечень изменений в Rust, Cargo и Clippy доступен в примечаниях к выпуску. Над версией 1.99.0 работало множество участников сообщества.
Источник: Lobsters
Комментарии
Войдите, чтобы комментировать.