Programski jezik Rust 1.98, koji je osnovao Mozilla projekat, ali se sada razvija pod pokroviteljstvom nezavisne neprofitne organizacije Rust Foundation, je objavljen. Jezik se fokusira na sigurnost memorije i pruža alate za postizanje visokog paralelizma izvršavanja zadataka, bez upotrebe sakupljača smeća i okruženja za izvršavanje (izvršavanje je svedeno na osnovnu inicijalizaciju i održavanje standardne biblioteke).
Rustove metode upravljanja memorijom su dizajnirane da eliminišu greške u manipulaciji pokazivačima i zaštite od problema koji proizlaze iz upravljanja memorijom na niskom nivou, kao što su pristup memoriji nakon što je oslobođena, dereferenciranje nultih pokazivača, prekoračenje bafera i tako dalje. Projekat razvija Cargo upravitelj paketa za distribuciju biblioteka, olakšavanje izgradnje i upravljanje zavisnostima. Repozitorij crates.io se održava za hostovanje biblioteka.
Sigurnost memorije je osigurana u Rustu u vrijeme kompajliranja kroz provjeru referenci, praćenje vlasništva nad objektom, praćenje životnog vijeka objekata (opsega) i procjenu ispravnosti pristupa memoriji tokom izvršavanja koda. Rust također pruža zaštitu od prekoračenja cijelih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli po defaultu, nudi snažno statičko kucanje kako bi se minimizirale logičke greške.
Glavne inovacije:
- Za tipove f32 i f64 s pomičnim zarezom implementirane su algebarske metode za sabiranje, oduzimanje, množenje, dijeljenje i ostatak, implementirajući optimizacije slične opciji "-ffast-math" u C/C++ kompajlerima. Ove metode omogućavaju promjenu redoslijeda operacija kada je to potrebno za optimizacije poput vektorizacije petlji. Na primjer, prilikom izračunavanja "a + b + c + d" korištenjem regularnog sabiranja, kompajler će uvijek izvršiti izračunavanje istim redoslijedom: "((a + b) + c) + d", ali korištenjem metode algebraic_add, može grupirati izraz kao "(a + b) + (c + d)" i izvršiti "(a + b)" i "(c + d)" paralelno koristeći SIMD instrukcije. Cijena korištenja algebarskih metoda je nedeterminizam rezultata izračuna, koji mogu varirati unutar margine greške.
- Svi primitivni cjelobrojni tipovi imaju ugrađenu metodu "format_into" za pretvaranje brojeva u stringove, koja se može koristiti umjesto itoa paketa. NumBuffer bafer se prosljeđuje kao parametar. , čija je veličina zagarantovano dovoljna za zapisivanje bilo koje vrijednosti korištenog tipa u decimalnom obliku. Izlaz je formatirani niz &str, čiji je životni vijek vezan za bafer.
- Interakcija između opreme ManuallyDrop i pametnog pokazivača Box više ne rezultira nedefiniranim ponašanjem.
- Novi dio API-ja je premješten u kategoriju stabilnih, uključujući metode i implementacije osobina koje su stabilizirane:
- str::substr_range
- [T]::podslice_raspon
- core::fmt::NumBuffer
- <{cijeli broj}>::format_u
- Pošalji/Sinhroniziraj za std::process::CommandArgs
- {fN}::algebraično_dodavanje
- {fN}::algebraic_sub
- {fN}::algebraic_mul
- {fN}::algebraički_div
- {fN}::algebraic_rem
- Nenula<{cijeli broj}>::from_str_radix
- String::from_utf16le
- String::from_utf16le_lossy
- String::from_utf16be
- String::from_utf16be_lossy
- [T]::strip_circumfix
- str::strip_circumfix
- Atomski ::from_mut
- Atomski ::get_mut_slice
- Atomski ::from_mut_slice
- std::range::legacy
- Ciljne platforme thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf i thumbv8r-none-eabihf su premještene na drugi nivo podrške, koji uključuje garanciju izgradnje, ali ne i garancije za prolazak testnog paketa.
- Dodana je podrška za platforme powerpc64-unknown-linux-gnuelfv2 i aarch64-unknown-linux-pauthtest, koje su sada na nivou podrške 3. Nivo 3 uključuje osnovnu podršku, ali ne uključuje automatizirano testiranje, službena izdanja verzija ili verifikaciju verzija.
Pored toga, kompromitovan je popularni paket arrayref, koji je preuzet preko 53 miliona puta u posljednjih 90 dana i koji 403 paketa koriste kao zavisnost. Napadači su u repozitorij crates.io objavili nove pakete koji sadrže zlonamjerni kod: proc-macro1, proc-macro-en, aovine, arone, aronenao i tinymember. Nakon toga, u repozitorij su objavljena nova izdanja arrayref 0.3.10, internment 0.8.7 i append-only-vec 0.1.9, a svako od njih je dodalo zlonamjerni paket proc-macro1 kao zavisnost. Zlonamjerna verzija paketa arrayref objavljena je 20. augusta u 10:15 (MSK) i ostala je aktivna do 11:41, nakon čega su je administratori crates.io uklonili.
Održavatelj arrayref-a još nije kontaktiran radi pojašnjenja situacije, ali se vjeruje da su napadači presreli njihove akreditive. U paketu proc-macro1, zlonamjerna promjena bila je prisutna u skripti za izgradnju i učitala je izvršnu datoteku iz vanjskog direktorija. serverPreuzeta datoteka je sačuvana kao /tmp/rust-setup na Unix sistemima, a u Windows — %TEMP%\rust-setup.ps1 ili %TEMP%\rust-setup-launch.vbs.
izvor: opennet.ru
