Lëshimi i gjuhës programuese Rust 1.74. Auditimi i RustVMM. Rishkrimi i binderit në ndryshk

Gjuha e programimit për qëllime të përgjithshme Rust 1.74, e themeluar nga projekti Mozilla, por tani e zhvilluar nën kujdesin e organizatës së pavarur jofitimprurëse Rust Foundation, është publikuar. Gjuha fokusohet në sigurinë e kujtesës dhe siguron mjetet për të arritur paralelizëm të lartë të punës duke shmangur përdorimin e një grumbulluesi të mbeturinave dhe kohën e funksionimit (koha e funksionimit reduktohet në inicializimin bazë dhe mirëmbajtjen e bibliotekës standarde).

Metodat e trajtimit të memories Rust e ruajnë zhvilluesin nga gabimet gjatë manipulimit të treguesve dhe mbrojnë nga problemet që lindin për shkak të trajtimit të nivelit të ulët të kujtesës, të tilla si qasja në një zonë memorie pasi të jetë liruar, mosreferencimi i treguesve null, tejkalimet e buferit, etj. Për të shpërndarë bibliotekat, për të ofruar ndërtime dhe për të menaxhuar varësitë, projekti zhvillon menaxherin e paketave Cargo. Depoja e crates.io mbështetet për pritjen e bibliotekave.

Siguria e memories sigurohet në Rust në kohën e përpilimit përmes kontrollit të referencës, mbajtjes së gjurmës së pronësisë së objektit, mbajtjes së gjurmëve të jetëgjatësisë së objektit (scopes) dhe vlerësimit të saktësisë së aksesit në kujtesë gjatë ekzekutimit të kodit. Rust siguron gjithashtu mbrojtje kundër tejmbushjeve të numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave përpara përdorimit, trajton më mirë gabimet në bibliotekën standarde, zbaton konceptin e referencave dhe variablave të pandryshueshme si parazgjedhje, ofron shtypje të fortë statike për të minimizuar gabimet logjike.

Risitë kryesore:

  • U shtua aftësia për të konfiguruar kontrollet e lintit nëpërmjet skedarit Cargo.toml me manifestin e menaxherit të paketave. Për të përcaktuar cilësimet e garzave, të tilla si niveli i përgjigjes (ndalo, moho, paralajmëro, lejo), propozohen seksione të reja "[lints]" dhe "[workspace.lints]", ndryshimet në të cilat merren parasysh kur merret një vendim për rindërtimi. Për shembull, në vend që të specifikoni flamujt "-F", "-D", "-W" dhe "-A" kur montoni ose shtoni "#![forbid(unsafe_code)]" dhe "#![mono (clippy) :” atributet e kodit) :enum_glob_use)]" tani mund të përdoret në manifestin e ngarkesave: [lints.rust] unsafe_code = "ndaloj" [lints.clippy] enum_glob_use = "moho"
  • Menaxheri i paketave Crate ka shtuar aftësinë për të vërtetuar kur lidheni me një depo. Paketa bazë përfshin mbështetje për vendosjen e parametrave të vërtetimit në dyqanet e kredencialeve Linux (bazuar në libsecret), macOS (Keychain) dhe Windows (Windows Credential Manager), por sistemi fillimisht është bërë modular dhe ju lejon të organizoni punën me ofrues të ndryshëm për ruajtjen dhe duke gjeneruar argumente, për shembull, një shtojcë është përgatitur për përdorimin e menaxherit të fjalëkalimeve 1Password. Autentifikimi mund të kërkohet nga depoja për çdo operacion, jo vetëm për të konfirmuar që paketat janë publikuar. ~/.cargo/config.toml [regjistri] global-credential-providers = ["cargo:token", "cargo:libsecret"]
  • Mbështetja për projeksionet e llojit të kthimit (impl_trait_projections) është stabilizuar, duke lejuar që Self dhe T::Assoc të përmenden në llojet e kthimit si "async fn" dhe "->impl Trait". struct Wrapper<'a, T>(&'a T); ( } } tipar Trait<'a> { type Assoc; fn new() -> Vetë::Asoc; } impl Trait<'_> for () { type Assoc = (); fn new() {} } // Llojet e kthimit të patejdukshëm që përmendin një lloj të lidhur: impl<'a, T: Trait<'a>> Wrapper<'a, T> { async fn mk_assoc() -> T::Assoc { /* … */ } fn a_few_assocs() -> impl Iterator { /* … */ } }
  • Një pjesë e re e API-së është zhvendosur në kategorinë e qëndrueshme, duke përfshirë metodat dhe implementimet e tipareve janë stabilizuar:
  • Atributi "const", i cili përcakton mundësinë e përdorimit të tij në çdo kontekst në vend të konstanteve, përdoret në funksionet:
    • thelbi::mem::transmute_copy
    • str::is_ascii
    • [u8]::is_ascii
    • bërthamë::num::Ngopur
    • impl Nga për std::process::Stdio
    • impl Nga për std::process::Stdio
    • impl Nga për std::process::Child{Stdin, Stdout, Stderr}
    • impl Nga për 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::Gabim::tjetër
    • impl TryFrom për u16
    • implikoj Nga<&[T; N]>për Vec
    • implikoj Nga<&mut [T; N]>për Vec
    • implikoj Nga<[T; N]> për Arc<[T]>
    • implikoj Nga<[T; N]> për Rc<[T]>
  • Përpiluesi, paketa e veglave, biblioteka standarde dhe ekzekutuesit e krijuar të aplikacioneve kanë rritur kërkesat për platformat e Apple, duke kërkuar tani të paktën macOS 10.12 Sierra, iOS 10 dhe tvOS 10 të lëshuar në 2016 për t'u ekzekutuar.
  • Niveli i tretë i mbështetjes është zbatuar për platformën i686-pc-windows-gnullvm. Niveli i tretë përfshin mbështetjen bazë, por pa testim të automatizuar, publikim të ndërtimeve zyrtare ose kontrollim nëse kodi mund të ndërtohet.
  • Niveli i dytë i mbështetjes për platformën e synuar loongarch64-unknown-none është zbatuar. Niveli i dytë i mbështetjes përfshin një garanci montimi.

Për më tepër, mund të vërehen dy ngjarje që lidhen me gjuhën Rust:

  • OSTIF (Open Source Technology Improvement Fund), i krijuar për të forcuar sigurinë e projekteve me burim të hapur, ka publikuar rezultatet e një auditimi të projektit RustVMM, i cili ofron komponentë për krijimin e hipervizorëve specifikë për detyra dhe monitorëve të makinave virtuale (VMM). Kompani të tilla si Intel, Alibaba, Amazon, Google, Linaro dhe Red Hat po marrin pjesë në zhvillimin e projektit. Hipervizorët Intel Cloud Hypervisor dhe Dragonball janë duke u zhvilluar bazuar në RustVMM. Auditimi konfirmoi cilësinë e lartë të bazës së kodit dhe përdorimin e teknikave në arkitekturë dhe zbatim që synojnë arritjen e sigurisë maksimale. Gjatë auditimit janë evidentuar 6 probleme që nuk kanë pasur ndikim të drejtpërdrejtë në siguri.
  • Google prezantoi një zbatim të ri të mekanizmit të komunikimit ndërprocesor Binder, të rishkruar në gjuhën Rust, në listën e postimeve të zhvilluesve të kernelit Linux. Ripunimi u krye si pjesë e një projekti për forcimin e sigurisë, promovimin e teknikave të programimit të sigurt dhe rritjen e efikasitetit të identifikimit të problemeve kur punoni me memorie në Android (rreth 70% e të gjitha dobësive të rrezikshme të identifikuara në Android shkaktohen nga gabimet gjatë punës me memorie ). Zbatimi i Binder në Rust ka arritur barazi në funksionalitet me versionin origjinal në gjuhën C, kalon të gjitha testet AOSP (Android Open-Source Project) dhe mund të përdoret për të krijuar botime pune të firmuerit. Performanca e të dy implementimeve është afërsisht në të njëjtin nivel (devijimet brenda -1.96% dhe +1.38%).

Burimi: opennet.ru

Shto një koment