Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Добавлен API std::thread::scope, позволяющий создавать потоки в привязке к области видимости (Scoped threads). В отличие от ранее доступных потоков новый API std::thread::scope допускает передачу заимствованных (borrowing) нестатических данных, в то время как потоки, создаваемые при помощи классического API std::thread::spawn, должны были владеть всеми передаваемыми аргументами и не могли получать заимствованные переменные. API std::thread::scope гарантирует, что любые порождённые потоки будут завершены до возвращения данных, обеспечивая должный уровень безопасности для механизма заимствования.
- Предложены новые типы-обвязки для файловых дескрипторов — BorrowedFd и OwnedFd, обеспечивающие заимствование и владение. Типы помечены при помощи «#[repr(transparent)]», что позволяет напрямую использовать их во внешних Си-привязках с учётом владения.
- Предоставлена возможность вызова Condvar::new, Mutex::new и RwLock::new в контексте констант для создания глобальных статических значений Mutex, RwLock и Condvar без применения пакетов типа lazy_static.
- Для функций типа fn foo‹T›(value: T, f: impl Copy) разрешено использование синтаксиса вида «foo::‹u32›(3, 3)», явно указывая тип дженерика.
- Завершён переход на использование техники NLL (Non-Lexical Lifetimes) для выявления проблем с заимствованием переменных. NLL осуществляет учёт на уровне набора указателей в графе потока выполнения, что позволяет увеличить качество проверки заимствования переменных (borrow checker) и допустить выполнение некоторых видов корректного кода, использование которого ранее приводило к выводу ошибки. Поддержка старого механизма, использовавшего привязку времени жизни на лексическом уровне, теперь полностью удалена из rustc, а использование нового NLL внедрено повсеместно.
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
array::from_fn
Box::into_pin
BinaryHeap::try_reserve
BinaryHeap::try_reserve_exact
OsString::try_reserve
OsString::try_reserve_exact
PathBuf::try_reserve
PathBuf::try_reserve_exact
Path::try_exists
Ref::filter_map
RefMut::filter_map
NonNull::‹[T]›::len
ToOwned::clone_into
Ipv6Addr::to_ipv4_mapped
unix::io::AsFd
unix::io::BorrowedFd‹'fd›
unix::io::OwnedFd
windows::io::AsHandle
windows::io::BorrowedHandle
windows::io::OwnedHandle
windows::io::HandleOrInvalid
windows::io::HandleOrNull
windows::io::InvalidHandleError
windows::io::NullHandleError
windows::io::AsSocket
windows::io::BorrowedSocket‹'handle›
windows::io::OwnedSocket
thread::scope
thread::Scope
-
thread::ScopedJoinHandle
- Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в функциях:
array::from_ref
slice::from_ref
intrinsics::copy
intrinsics::copy_nonoverlapping
‹*const T›::copy_to
‹*const T›::copy_to_nonoverlapping
‹*mut T›::copy_to
‹*mut T›::copy_to_nonoverlapping
‹*mut T›::copy_from
‹*mut T›::copy_from_nonoverlapping
str::from_utf8
Utf8Error::error_len
Utf8Error::valid_up_to
Condvar::new
Mutex::new
RwLock::new
Дополнительно можно отметить инициативу по использованию языка Rust для написания работающего на уровне ядра Linux драйвера для GPU Apple AGX, используемого в чипах Apple M1 и M2.
Отмечается, что GPU Apple AGX выполняет прошивку и использует достаточно сложные совместно используемые структуры данных. Реализация управления прошивками и структурами на Rust позволила бы упростить разработку и добиться более высокой безопасности. Рассматриваются два варианта разработки: написание основой части на Си, но использование компонентов на Rust для взаимодействия с прошивкой и управления структурами данных в разделяемой памяти, или написание всего драйвера на Rust и создание Rust-обвязки для подсистемы DRM.
Источник: http://www.opennet.ru/opennews/art.shtml?num=57628