Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Добавлена возможность настройки lint-проверок через файл Cargo.toml с манифестом пакетного менеджера. Для определения настроек lint, таких как уровень реагирования (forbid, deny, warn, allow), предложены новые секции «[lints]» и «[workspace.lints]», изменение которых учитывается при принятии решения о пересборке. Например, вместо указания при сборке флагов «-F», «-D», «-W» и «-A» или добавления в код атрибутов «#![forbid(unsafe_code)]» и «#![deny(clippy::enum_glob_use)]» теперь можно использовать в манифесте Cargo:
[lints.rust] unsafe_code = "forbid" [lints.clippy] enum_glob_use = "deny"
- В пакетный менеджер Crate добавлена возможность аутентификации при подключении к репозиторию. В базовую поставку включена поддержка размещения параметров аутентификации в хранилищах учётных данных Linux (на базе libsecret), macOS (Keychain) и Windows (Windows Credential Manager), но система изначально сделана модульной и позволяет организовать работу с различными провайдерами для хранения и генерации токенов, например, подготовлен плагин для использования менеджера паролей 1Password. Аутентификация может запрашиваться репозиторием для любых операций, а не только для подтверждения публикации пакетов.
~/.cargo/config.toml [registry] global-credential-providers = ["cargo:token", "cargo:libsecret"]
- Стабилизирована поддержка проекций возвращаемых типов (impl_trait_projections), позволяющая упоминать Self и T::Assoc в возвращаемых типах, таких как «async fn» и «-› impl Trait».
struct Wrapper‹'a, T›(&'a T); // Opaque return types that mention `Self`: impl Wrapper‹'_, ()› { async fn async_fn() -› Self { /* ... */ } fn impl_trait() -› impl Iterator
- { /* ... */ } } trait Trait‹'a› { type Assoc; fn new() -> Self::Assoc; } impl Trait‹'_› for () { type Assoc = (); fn new() {} } // Opaque return types that mention an associated type: impl‹'a, T: Trait‹'a›› Wrapper‹'a, T› { async fn mk_assoc() -> T::Assoc { /* ... */ } fn a_few_assocs() -› impl Iterator‹Item = T::Assoc› { /* ... */ } }
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в функциях:
core::num::Saturating
impl From<:stdout> for std::process::Stdio
impl From<:stderr> for std::process::Stdio
impl From
for std::process::Child{Stdin, Stdout, Stderr} impl From
for std::process::Child{Stdin, Stdout, Stderr} std::ffi::OsString::from_encoded_bytes_unchecked
std::ffi::OsString::into_encoded_bytes
std::ffi::OsStr::from_encoded_bytes_unchecked
std::ffi::OsStr::as_encoded_bytes
std::io::Error::other
impl TryFrom‹char› for u16
impl‹T: Clone, const N: usize› From‹&[T; N]› for Vec‹T›
impl‹T: Clone, const N: usize› From‹&mut [T; N]› for Vec‹T›
impl‹T, const N: usize› From‹[T; N]› for Arc‹[T]›
impl‹T, const N: usize› From‹[T; N]› for Rc‹[T]›
- В компиляторе, инструментарии, стандартной библиотеке и генерируемых исполняемых файлах приложений повышены требования к платформам Apple: для работы теперь требуются как минимум версии
macOS 10.12 Sierra, iOS 10 и tvOS 10, выпущенные в 2016 году. - Реализован третий уровень поддержки для платформы i686-pc-windows-gnullvm. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
- Реализован второй уровень поддержки целевой платформы loongarch64-unknown-none. Второй уровень поддержки подразумевает гарантию сборки.
Дополнительно можно отметить два события, связанных с языком Rust:
- Фонд OSTIF (Open Source Technology Improvement Fund), созданный с целью усиления защищённости открытых проектов, опубликовал результаты аудита проекта RustVMM, предоставляющего компоненты для создания специфичных для определённых задач гипервизоров и мониторов виртуальных машин (VMM). В разработке проекта участвуют такие компании, как Intel, Alibaba, Amazon, Google, Linaro и Red Hat.
На базе RustVMM развиваются гипервизоры Intel Cloud Hypervisor и Dragonball. Аудит подтвердил высокое качество кодовое базы и использование в архитектуре и реализации приёмов, нацеленных на достижение максимальной безопасности. В ходе аудита было выявлено 6 проблем, не имеющих прямого влияния на безопасность. - Компания Google представила в списке рассылки разработчиков ядра Linux новую реализацию механизма межпроцессного взаимодействия Binder, переписанную на языке Rust. Переработка выполнена в рамках проекта по усилению защищённости, продвижению приёмов безопасного программирования и повышению эффективности выявления проблем при работе с памятью в Android (около 70% из всех опасных уязвимостей, выявленных в Android, вызваны ошибками при работе с памятью). Реализация Binder на Rust достигла паритета в функциональности с изначальным вариантом на языке Си, проходит все тесты AOSP (Android Open-Source Project) и может использоваться для создания рабочих редакций прошивок. Производительность обеих реализаций находится примерно на одном уровне (отклонения в пределах -1.96% и +1.38%).
Источник: http://www.opennet.ru/opennews/art.shtml?num=60133