Bol zverejnený release programovacieho jazyka Rust 1.99, ktorý bol pôvodne vyvinutý projektom Mozilla, ale teraz je rozvíjaný pod záštitou nezávislej neziskovej organizácie Rust Foundation. Jazyk je zameraný na bezpečné zaobchádzanie s pamäťou a poskytuje prostriedky na dosiahnutie vysokej paralelizácie vykonávania úloh, pričom sa obchádza bez používania garbage collectora a runtime (runtime sa redukuje na základnú inicializáciu a údržbu štandardnej knižnice).
Metódy práce s pamäťou v Rust sú zamerané na vylúčenie chýb pri manipulácii s ukazovateľmi a ochranu pred problémami vyplývajúcimi z nízkoúrovňovej práce s pamäťou, ako sú prístup k pamäťovým oblastiam po ich uvoľnení, dereferencovanie nulových ukazovateľov, pretečenie buffera a podobne. Na distribúciu knižníc, zabezpečenie zostavenia a správu závislostí sa vyvíja balíkový manažér Cargo. Na hostenie knižníc sa podporuje repozitár crates.io.
Bezpečné zaobchádzanie s pamäťou je v Rust zabezpečené už pri kompilácii prostredníctvom kontroly odkazov, sledovania vlastníctva objektov, zohľadňovania životnosti objektov (rozsah viditeľnosti) a posudzovania správnosti prístupu k pamäti počas vykonávania kódu. Rust tiež poskytuje prostriedky na ochranu pred celočíselnými pretečeniami, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie spracováva chyby v štandardnej knižnici, aplikuje koncept nemennosti (immutable) odkazov a premenných ako predvolené a ponúka silnú statickú typizáciu na minimalizáciu logických chýb.
Hlavné novinky:
- Bola poskytnutá možnosť vytvárania funkcií v jazyku Rust s variabilným počtom argumentov (variadic), exportovaných na volanie z projektov v jazyku C (C ABI). Ako posledný prvok zoznamu parametrov v takýchto funkciách môže byť zadaná konštrukcia „…“, ktorá sa spracováva v Rust pomocou špeciálneho typu VaList, pracujúceho podobne ako va_list v C. unsafe extern "C" fn sum(mut args: …) -> i32 { let a = unsafe { args.next_arg::() }; let b = unsafe { args.next_arg::() }; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
- Boli stabilizované funkcie Layout::for_value_raw, mem::size_of_val_raw a mem::align_of_val_raw, ktoré umožňujú bezpečne určiť veľkosť a zarovnanie pomocou surových ukazovateľov (raw pointer), vrátane typov s dynamickou veľkosťou, ako sú rezy, bez potreby vytvárania odkazov na dáta.
- Do dokumentácie bola pridaná odporúčanie vyhnúť sa uvoľneniu pamäte, na ktorú bola získaná statická referencia s neobmedzenou životnosťou (&’static) prostredníctvom volania Box::leak (round-trip unleaking), pretože takéto konanie môže potenciálne viesť k problémom kvôli nekompatibilite s budúcimi optimalizáciami kompilátora a pripojenými mechanizmami prideľovania pamäte. Namiesto vytvárania statickej referencie na dočasný prevod vlastníctva sa odporúča používať surové ukazovatele, napríklad prostredníctvom volania Box::into_non_null.
- Do oblasti stabilných bol prenesený nový balík API, vrátane stabilizovaných metód a implementácií traitov:
- IntoIterator for Box
- IntoIterator for &Box
- IntoIterator for &mut Box
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator for StepBy
- std::fs::set_times
- std::fs::set_times_nofollow
- V balíčkovom manažéri cargo bol implementovaný nový vstavaný profil „debug“, ktorý je analogický profilu „dev“ (v budúcnosti plánujú oddeliť možnosti na ladenie a vývoj). Pri zostavovaní v CI je inkrementálna kompilácia predvolene vypnutá.
- Cieľová platforma riscv64-unknown-linux-musl bola prevedená na druhú úroveň podpory, čo znamená záruku zostavenia, ale bez záruk pri prechode testovacím súborom.
Dodatočne môžeme spomenúť nedávno oznámené projekty a udalosti týkajúce sa Rust:
- Spoločnosť Microsoft preložila Rust medzi jazyky prvej úrovne a zabezpečí jeho plnú podporu počas všetkých fáz vývoja v rámci spoločnosti. Predtým bola prvá úroveň podpory v rámci spoločnosti poskytovaná pre jazyky C++, C# a TypeScript. Uvádza sa, že Rust už používa viac ako 100 repozitárov Microsoftu. Okrem iného sa komponenty na Rust už aplikujú v produktoch ako Microsoft 365 a Copilot a pre kompilátor MSVC bol pripravený samostatný backend rustc_codegen_utc pre Rust, založený na kompilátore rustc.
Ako hlavný cieľ použitia Rust v Microsofte sa uvádza posilnenie bezpečnosti kódu, kritického z pohľadu bezpečnosti. Podľa technického riaditeľa Microsoft Azure je približne 70% všetkých zraniteľností vo Windows spôsobených problémami s pamäťou, ktorých sa možno vyhnúť použitím Rust.
- Spoločnosť Google odstránila zo systému Linux starú implementáciu mechanizmu medzi procesmi IPC Binder, napísanú v jazyku C, v prospech nového ovládača Binder IPC, ktorý bol prepísaný v Rust. Uvádza sa, že za 15 rokov existencie starej verzie sa nahromadil značný technický dlh a množstvo zložitostí, ktoré sťažovali vyhľadávanie chýb, údržbu a pridávanie nových funkcií. Ovládač Binder IPC na Rust je uznávaný ako hlavný a už sa nepredstavuje ako experimentálna verzia.
- Bol zverejnený výstup Arti 2.7.0, implementácie nástrojov Tor, napísanej v jazyku Rust. Keď kód Arti dosiahne úroveň, ktorá je schopná úplne nahradiť variant v C, vývojári Tor plánujú pridelit Arti status hlavnej implementácie Tor a postupne ukončiť údržbu implementácie v C. V novej verzii je rozvinutá funkcionalita pre relé a serverov adresár (Directory Authority) súvisiaci s analýzou dokumentov, podporou zrkadlenia serverov adresárov a spracovaním DNS dopravy. Pridaná implementácia RPC na zmenu a kontrolu konfigurácie. Opravených niekoľko zraniteľností — administrátorom onion služieb sa odporúča urgentne aktualizovať svoje systémy.
Zdroj: opennet.ru
