Vydaná verzia programovacieho jazyka Rust 1.98, pôvodne vyvinutého projektom Mozilla, no teraz rozvíjaného pod záštitou nezávislej neziskovej organizácie Rust Foundation. Jazyk je zameraný na bezpečnú manipuláciu s pamäťou a poskytuje prostriedky na dosahovanie vysokej paralelnosti vykonávania úloh, pričom sa zaobíde bez využitia garbage collectora a runtime (runtime je obmedzené na základnú inicializáciu a podporu š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:
- Pre typy s pohyblivou desatinnou čiarkou f32 a f64 sú implementované algebraické metódy na sčítanie, odčítanie, násobenie, delenie a získanie zvyšku, ktoré realizujú optimalizáciu podobnú možnosti „-ffast-math“ v kompilátoroch C/C++. Tieto metódy umožňujú zmenu poradia operácií, keď je to potrebné pre optimalizácie, ako je vektorizácia cyklov. Napríklad pri výpočte „a + b + c + d“ pri použití bežného sčítania kompilátor vždy vykoná výpočet v jednom poradí „((a + b) + c) + d“, avšak pri použití metódy algebraic_add môže zoskupiť vyjadrenie ako „(a + b) + (c + d)“ a vykonať „(a + b)“ a „(c + d)“ paralelne pomocou inštrukcií SIMD. Cena aplikácie algebraických metód spočíva v nedeterminovateľnosti výsledkov výpočtu, ktoré sa môžu líšiť v rámci presnosti.
- Pre všetky primitívne celistvé typy je implementovaná vstavaná metóda „format_into“ na prevod čísel na reťazce, ktorá sa môže použiť namiesto balíka itoa. Ako parameter sa odovzdáva vyrovnávací priestor NumBuffer<Self>, ktorého veľkosť je zaručene dostatočná na zapísanie akejkoľvek hodnoty používaného typu v desiatkovej forme. Na výstupe sa vracia naformátovaný reťazec &str, ktorého životnosť je viazaná na vyrovnávací priestor.
- Interakcia medzi obalom ManuallyDrop a inteligentným ukazovateľom Box teraz nevedie k nedefinovanému správaniu.
- Do oblasti stabilných bol prenesený nový balík API, vrátane stabilizovaných metód a implementácií traitov:
- str::substr_range
- [T]::subslice_range
- core::fmt::NumBuffer
- <{integer}>::format_into
- Send/Sync pre std::process::CommandArgs
- {fN}::algebraic_add
- {fN}::algebraic_sub
- {fN}::algebraic_mul
- {fN}::algebraic_div
- {fN}::algebraic_rem
- NonZero<{integer}>::from_str_radix
- String::from_utf16le
- String::from_utf16le_lossy
- String::from_utf16be
- String::from_utf16be_lossy
- [T]::strip_circumfix
- str::strip_circumfix
- Atomic<T>::from_mut
- Atomic<T>::get_mut_slice
- Atomic<T>::from_mut_slice
- std::range::legacy
- Cieľové platformy thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf a thumbv8r-none-eabihf boli prevedené na druhú úroveň podpory, ktorá zahŕňa záruku zostavenia, ale bez záruk pri prechode testovým súborom.
- Pridaná podpora platforiem powerpc64-unknown-linux-gnuelfv2 a aarch64-unknown-linux-pauthtest, pre ktoré je zabezpečená tretia úroveň podpory. Tretia úroveň pokrýva základnú podporu, ale bez automatizovaného testovania, zverejňovania oficiálnych zostavení a overovania možnosti zostavenia kódu.
Okrem toho sa dá spomenúť kompromitácia populárneho crate-paketového systému arrayref, ktorý mal viac ako 53 miliónov stiahnutí za posledných 90 dní a používa sa ako závislosť v 403 pakete. Útočníci umiestnili do repozitára crates.io nové balíky proc-macro1, proc-macro-en, aovine, arone, aronenao a tinymember, ktoré obsahovali škodlivý kód. Následne boli v repozitári zverejnené nové verzie balíkov arrayref 0.3.10, internment 0.8.7 a append-only-vec 0.1.9, do ktorých bola pridaná škodlivá závislosť proc-macro1. Škodlivá verzia balíka arrayref bola umiestnená 20. augusta o 10:15 (MSK) a existovala do 11:41, po čom bola odstránená správou crates.io.
Zástupcovi balíka arrayref sa zatiaľ nepodarilo spojiť, aby objasnil situáciu, ale predpokladá sa, že jeho prihlasovacie údaje boli zachytené útočníkmi. V balíku proc-macro1 bola škodlivá zmena prítomná v skripte na zostavenie a vykonávala sťahovanie spustiteľného súboru z vonkajšieho zdroja. serveraStiahnutý súbor v Unix systémoch sa ukladal ako /tmp/rust-setup, a vo Windows ako %TEMP%\rust-setup.ps1 alebo %TEMP%\rust-setup-launch.vbs.
Zdroj: opennet.ru
