Апублікаваны рэліз мовы праграмавання агульнага прызначэння 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