Выпуск мовы праграмавання Rust 1.74. Аўдыт 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>(&'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 typ: impl<'a, T: Trait<'a>> Wrapper<'a, T> { 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<&[T; N]> for Vec
    • impl From<&mut [T; N]> for Vec
    • impl From<[T; N]> for Arc<[T]>
    • impl 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%).

Крыніца: opennet.ru

Дадаць каментар