Методы работы с памятью в Rust нацелены на исключение ошибок при манипулировании указателями и защиту от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Предоставлена возможность создания на языке Rust функций с переменным числом аргументов (variadic), экспортируемых для вызова из проектов на языке Си (C ABI). В качестве последнего элемента списка параметров в подобных функциях может указываться конструкуция "...", которая обрабатывается в Rust при помощи специального типа VaList, работающего аналогично va_list в C.
Код:
unsafe extern "C" fn sum(mut args: ...) -> i32 {
let a = unsafe { args.next_arg::‹i32›() };
let b = unsafe { args.next_arg::‹i32›() };
a + b
}
fn foo() -> i32 {
unsafe { sum(0i32, 2i32) }
} - Стабилизированы функции Layout::for_value_raw, mem::size_of_val_raw и mem::align_of_val_raw, позволяющие безопасно определять размер и выравнивание по сырым указателям (raw pointer), в том числе при использовании типов с динамическим размером, таких как срезы, без необходимости создания ссылок на данные.
- В документацию добавлена рекомендация избегать освобождения памяти, на которую была получена статическая ссылка с неограниченным временем жизни (&'static) через вызов Box::leak (round-trip unleaking), так как подобное действие потенциально может привести к проблемам из-за несовместимости с будущими оптимизациями компилятора и подключаемыми механизмами выделения памяти. Вместо создания статической ссылки для временной передачи владения рекомендуется использовать сырые указатели, например, через вызов Box::into_non_null.
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- IntoIterator for Box‹[T; N]>
- IntoIterator for &Box‹[T; N]>
- IntoIterator for &mut Box‹[T; N]>
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator for StepBy‹I>
- std::fs::set_times
- std::fs::set_times_nofollow
- В пакетном менеджере cargo реализован новый встроенный профиль "debug", аналогичный профилю "dev" (в будущем возможности для отладки и разработки планируют разделить). При сборке в CI по умолчанию отключена инкрементальная компиляция.
- Целевая платформа riscv64-unknown-linux-musl переведена на второй уровень поддержки, который подразумевает гарантию сборки, но отсутствие гарантий при прохождении тестового набора.
Дополнительно можно отметить недавно анонсированные проекты и события, связанные с Rust:
- Компания Microsoft перевела Rust в число языков первого уровня и обеспечит его полную поддержку на всех этапах разработки внутри компании. До этого первый
уровень поддержки внутри компании предоставлялся для языков C++, C# и TypeScript. Отмечается, что Rust уже используется в более чем 100 репозиториях Microsoft. Среди прочего, компоненты на Rust уже применяются в таких продуктах, как Microsoft 365 и Copilot, а для компилятора MSVC подготовлен отдельный бэкенд rustc_codegen_utc для Rust, основанный на компиляторе rustc.
В качестве основной цели применения Rust в Microsoft упоминается усиление защищённости кода, критичного с точки зрения безопасности. По словам технического директора Microsoft Azure около 70% всех уязвимостей в Windows вызваны проблемами при работе с памятью, которых можно избежать при использовании Rust. - Компания Google удалила из ядра Linux старую реализацию механизма межпроцессного взаимодействия Binder, написанную на языке Си, в пользу нового драйвера Binder IPC, переписанного на Rust. Отмечается, что за 15 лет существования старого драйвера в нём накопились значительный технический долг и обилие усложнений, которые затрудняли поиск ошибок, сопровождение и добавление новых возможностей. Драйвер Binder IPC на Rust признан основным и больше не преподносится как экспериментальная разработка.
- Опубликован выпуск Arti 2.7.0, реализации инструментария Tor, написанной на языке Rust. Когда код Arti достигнет уровня, способного полностью заменить вариант на Си, разработчики Tor намерены придать Arti статус основной реализации Tor и постепенно прекратить сопровождение реализации на Си. В новой версии проложено развитие функциональности для релеев и серверов директорий (Directory Authority), связанной с парсингом документов, поддержкой зеркалирования серверов директорий и обработкой DNS-трафика. Добавлена реализация RPC для изменения и проверки конфигурации. Устранено несколько уязвимостей - администраторам onion-сервисов рекомендовано срочно обновить свои системы.
Источник: https://www.opennet.ru/opennews/art.shtml?num=66386
(opennet.ru, основная лента)