Команда Rust рада сообщить о новой версии языка — 1.99.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.99.0 вам достаточно выполнить команду:

$ rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску 1.99.0.

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках!

Что стабилизировано в 1.99.0

Функции с переменным числом аргументов в extern “C”

В Rust 1.99.0 стабилизировано определение функций с переменным числом аргументов (variadic functions) с C-ABI для “C” и “C-unwind” ABI. Определённые таким образом вариативные функции используют список аргументов переменной длины (...) и принимают произвольное количество аргументов. Ранее Rust уже мог вызывать вариативные функции, определённые во внешнем коде (например, libc::printf). Начиная с Rust 1.99, такие функции можно писать непосредственно на самом Rust:

/// SAFETY: функция должна вызываться как минимум с 2 аргументами типа i32.
unsafe extern "C" fn sum(mut args: ...) -> i32 {
    // SAFETY: гарантируется вызывающей стороной.
    let a = unsafe { args.next_arg::<i32>() };
    let b = unsafe { args.next_arg::<i32>() };
    a + b
}

fn foo() -> i32 {
    unsafe { sum(0i32, 2i32) }
}

Типом для ... является VaList, который на всех целевых платформах ABI-совместим с типом va_list в C. Допустимые для чтения из VaList типы ограничиваются типажом VaArgSafe.

Более подробную информацию о C-вариативных функциях см. в Reference. Также в этом выпуске стабилизирована поддержка определения naked-функций с переменным числом аргументов с отличными от C-ABI, которые должны быть написаны с помощью встроенных ассемблерных вставок.

Информация о схеме размещения типа из “сырых” указателей

В этом выпуске определены требования безопасности для получения размера и выравнивания по “сырым” указателям как для типов Sized (тривиальная безопасность, уже была доступна в stable), так и для типов !Sized.

Для этого были стабилизированы три функции:

Рекомендации по освобождению памяти после Box::leak

Хотя семантика языка в Rust 1.99 не изменилась, мы обновили документацию к Box::leak, добавив рекомендацию отказаться от шаблонов, в которых эта память в дальнейшем освобождается. Это связано с тем, что подобный код проблемно взаимодействует с текущими и будущими потенциальными оптимизациями компилятора, а также особенно проблематичен на фоне предстоящей стабилизации пользовательских аллокаторов памяти. Вместо этого рекомендуется отдавать предпочтение Box::into_non_null или Box::into_raw.

Эта рекомендация распространяется и на другие leak-функции в стандартной библиотеке.

Стабилизированные API

Прочие изменения

Проверьте всё, что изменилось в Rust, Cargo и Clippy.

Кто работал над 1.99.0

Многие люди собрались вместе, чтобы создать Rust 1.99.0. Без вас мы бы не справились. Спасибо!

Комментарии (0)