Objavljen je novi izlaz programskog jezika Rust 1.98, koji je izvorno razvijen od strane Mozille, a trenutno ga razvija neprofitna organizacija Rust Foundation. Jezik se fokusira na sigurnu upravljanje memorijom i pruža sredstva za postizanje visokog paralelizma izvršavanja zadataka, a da pri tome ne koristi sakupljač smeća i runtime (runtime se svodi na osnovnu inicijalizaciju i podršku standardnoj biblioteci).
Metode upravljanja memorijom u Rust-u usmjerene su na isključivanje grešaka prilikom manipulacije pokazivačima i zaštitu od problema koji nastaju zbog niskonivojskog rada s memorijom, kao što su pristupanje memorijskom području nakon što je oslobođeno, dereferenciranje nultih pokazivača, izlazak iz okvira bafera itd. Za distribuciju biblioteka, osiguranje gradnje i upravljanje ovisnostima, projekt se razvija preko upravitelja paketa Cargo. Za hosting biblioteka podržava se repozitorij crates.io.
Sigurna manipulacija memorijom osigurava se u Rustu tijekom kompilacije provjerom referenci, praćenjem vlasništva nad objektima, uzimanjem u obzir vremena života objekata (opseg vidljivosti) i ocjenom točnosti pristupa memoriji tijekom izvršavanja koda. Rust također pruža sredstva za zaštitu od cjelobrojnih prekoračenja, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabla kao zadano te nudi snažnu statičku tipizaciju za minimiziranje logičkih grešaka.
Glavne novine:
- Za tipove s pomičnom zarezom f32 i f64 implementirane su algebarske metode za zbrajanje, oduzimanje, množenje, dijeljenje i pronalaženje ostatka, koje provode optimizaciju sličnu opciji „-ffast-math“ u C/C++ kompajlerima. Takve metode dopuštaju promjenu reda operacija kada je to potrebno za optimizacije, poput vektorizacije petlji. Na primjer, pri izračunavanju „a + b + c + d“ s običnim zbrajanjem, kompajler će uvijek izvršavati izračun u jednom redu „((a + b) + c) + d“, dok će korištenje metode algebraic_add omogućiti grupiranje izraza kao „(a + b) + (c + d)“ i izvršiti „(a + b)“ i „(c + d)“ paralelno pomoću SIMD instrukcija. Cijena primjene algebarskih metoda je nedeterminiranost rezultata izračuna, koji se mogu mijenjati unutar pogreške.
- Za sve primitivne cjelobrojne tipove implementirana je ugrađena metoda „format_into“ za pretvorbu brojeva u nizove, koja se može koristiti umjesto paketa itoa. Kao parametar se predaje spremnik NumBuffer<Self>, čija veličina je zajamčeno dovoljna za zapisivanje bilo koje vrijednosti korištenog tipa u decimalnom obliku. Na izlazu se vraća formatirani niz &str, čije vrijeme života je vezano uz spremnik.
- Interakcija između obavijestanja ManuallyDrop i pametnog pokazivača Box više ne dovodi do neodređenog ponašanja.
- U stabilne verzije prebačen je novi set API-ja, uključujući stabilizirane metode i implementacije tipa:
- str::substr_range
- [T]::subslice_range
- core::fmt::NumBuffer
- <{integer}>::format_into
- Send/Sync za 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
- Ciljane platforme thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf i thumbv8r-none-eabihf su prebačene na drugi nivo podrške, koji podrazumeva garantovanu gradnju, ali bez garancije za prolaz kvestionara.
- Dodana je podrška za platforme powerpc64-unknown-linux-gnuelfv2 i aarch64-unknown-linux-pauthtest, za koje je obezbeđena treća nivo podrške. Treći nivo pokriva osnovnu podršku, ali bez automatizovanog testiranja, objavljivanja zvaničnih verzija i provere mogućnosti gradnje koda.
Dodatno se može primetiti kompromitacija popularnog crate-paketa arrayref, sa više od 53 miliona preuzimanja u poslednjih 90 dana i korišćenog kao zavisnost u 403 paketa. Napadači su postavili nove pakete proc-macro1, proc-macro-en, aovine, arone, aronenao i tinymember u repozitorijum crates.io, koji sadrže zlonamerni kod. Nakon toga su u repozitorijumu objavljene nove verzije paketa arrayref 0.3.10, internment 0.8.7 i append-only-vec 0.1.9, u koje je kao zavisnost dodat zlonamerni paket proc-macro1. Zlonamenska verzija paketa arrayref je postavljena 20. avgusta u 10:15 (MSK) i postojala je do 11:41, nakon čega je uklonjena od strane administratora crates.io.
Nije uspelo da se stupi u kontakt sa pratiocem arrayref za razjašnjenje situacije, ali se pretpostavlja da su njegovi podaci kompromitovani od strane napadača. U paketu proc-macro1, zlonamerna izmena je postojala u skripti za gradnju i vršila preuzimanje izvršne datoteke sa spoljnog poslužitelja. Preuzeta datoteka na Unix sistemima se čuvala kao /tmp/rust-setup, a na Windows-u — %TEMP%\rust-setup.ps1 ili %TEMP%\rust-setup-launch.vbs.
Izvor: opennet.ru
