Выпуск языка программирования Rust 1.73. Аудит RustVMM. Переписывание Binder на Rust

Опубликован релиз языка программирования общего назначения Rust 1.74, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Методы работы с памятью в 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); // Opaque return types that mention ‘Self’: impl Wrapper { async fn async_fn() -> Self { /* … */ } fn impl_trait() -> impl Iterator { /* … */ } } trait Trait { type Assoc; fn new() -> Self::Assoc; } impl Trait for () { type Assoc = (); fn new() {} } // Opaque return types that mention an associated type: impl> Wrapper { async fn mk_assoc() -> T::Assoc { /* … */ } fn a_few_assocs() -> impl Iterator { /* … */ } }
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
  • Признак “const”, определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • core::mem::transmute_copy
    • str::is_ascii
    • [u8]::is_ascii
    • core::num::Saturating
    • impl From for std::process::Stdio
    • impl From 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 for u16
    • impl From for Vec
    • impl From for Vec
    • impl From for Arc
    • impl From for Rc
  • В компиляторе, инструментарии, стандартной библиотеке и генерируемых исполняемых файлах приложений повышены требования к платформам 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%).

Release. Ссылка here.