Megjelent a Rust 1.98 programozási nyelv, amelyet a Mozilla projekt indított, de ma már egy független nonprofit szervezet, a Rust Foundation fejlődtet. A nyelv a memória biztonságos kezelésére összpontosít, és olyan eszközöket biztosít, amelyek lehetővé teszik a feladatok magas párhuzamos végrehajtását, elkerülve a szemétgyűjtő és futási idő használatát (a futási idő csupán az alapvető inicializálásra és a standard könyvtár kísérésére korlátozódik).
A Rust memória kezelésének módszerei arra irányulnak, hogy kiküszöböljék a pointerekkel végzett manipuláció során fellépő hibákat, és megvédjék a memória alacsony szintű használatából adódó problémáktól, mint például a már felszabadított memória területekhez való hozzáférés, a null pointerek dereferálása, a buffer túlfolyás és hasonlók. A könyvtárak terjesztésére, a fordítás biztosítására és a projektek függőségeinek kezelésére a Cargo csomagkezelő fejlődik.
A memória biztonságos kezelése a Rustban a fordítási időben történik, a hivatkozások ellenőrzésén, az objektumok tulajdonjogának nyomon követésén, az objektumok élettartamának (láthatóságának) figyelembevételén és a memória hozzáférésének helyességének értékelésén keresztül a kód futtatásakor. A Rust emellett eszközöket biztosít az egész számok túllépésének elleni védelemhez, kötelezővé teszi a változók értékeinek inicializálását használat előtt, jobban kezeli a hibákat a standard könyvtárban, alkalmazza a változatlan (immutable) hivatkozások és változók fogalmát alapértelmezés szerint, és erős statikus típussal minimalizálja a logikai hibákat.
Főbb újítások:
- A f32 és f64 lebegőpontos típusokhoz algebrai módszerek valósultak meg az összegzés, kivonás, szorzás, osztás és maradék meghatározására, amelyek optimizálást valósítanak meg, hasonlóan a C/C++ fordítók „-ffast-math” opciójához. Az ilyen módszerek lehetővé teszik a műveletek sorrendjének megváltoztatását, amikor ez szükséges az optimalizálások, például a ciklusok vektorizálása érdekében. Például, az „a + b + c + d” számításakor a szokásos összeadással a fordító mindig ugyanabban a sorrendben hajtja végre a számítást: „((a + b) + c) + d”, míg az algebrai_add módszer használatakor a kifejezés csoportosítható: „(a + b) + (c + d)”, és a „(a + b)” és a „(c + d)” párhuzamosan hajthatók végre SIMD utasítások segítségével. Az algebrai módszerek alkalmazásának ára a számítások nem determinisztikus eredménye, amelyek a hibahatárokon belül változhatnak.
- Minden primitív egész szám típushoz beépített „format_into” metódus valósult meg számok karakterlánccá alakításához, amely a itoa csomag helyett használható. Paraméterként a NumBuffer<Self> puffer kerül átadásra, amelynek mérete garantáltan elegendő bármely típusú érték tizedes formájú írására. A kimenetként visszatérő karakterlánc &str, amelynek élettartama a pufferhez van kötve.
- A ManuallyDrop kötések és a okos mutató, a Box közötti interakció már nem vezet meghatározhatatlan viselkedéshez.
- Új API-k kerültak a stabil kiadások közé, beleértve a metódusok és típusimplementációk stabilizálását:
- str::substr_range
- [T]::subslice_range
- core::fmt::NumBuffer
- <{integer}>::format_into
- Send/Sync for 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
- A célplatformok: thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf és thumbv8r-none-eabihf a második szintű támogatásra kerültek, ami a build garanciáját jelenti, de tesztelési garancia nélkül.
- Hozzáadva a powerpc64-unknown-linux-gnuelfv2 és aarch64-unknown-linux-pauthtest platformok támogatása, amelyekhez harmadik szintű támogatás biztosított. A harmadik szint alapvető támogatást kínál, de automatikus tesztelés, hivatalos build kiadás és a kód buildelésének ellenőrzése nélkül.
Továbbá megemelhető a népszerű crate csomag, az arrayref kompromittálása, amely az utolsó 90 napban több mint 53 millió letöltést számlál és 403 csomag függőségeként szerepel. A támadók új proc-macro1, proc-macro-en, aovine, arone, aronenao és tinymember csomagokat helyeztek el a crates.io repository-ban, amelyek rosszindulatú kódot tartalmaztak. Ezt követően új kiadások jelentek meg az arrayref 0.3.10, internment 0.8.7 és append-only-vec 0.1.9 csomagokból, amelyekhez a proc-macro1 rosszindulatú csomag mint függőség került. A rosszindulatú arrayref csomag 20-án 10:15-kor (MSK) lett közzé téve és 11:41-ig élt, majd eltávolították a crates.io adminisztrátorai.
A kapcsolattartóval az arrayref csomagnál eddig nem sikerült felvenni a kapcsolatot a helyzet tisztázása érdekében, de feltételezhető, hogy a hitelesítő adatait rosszindulatú támadók eltérítették. A proc-macro1 csomagban a rosszindulatú módosítás a buildelési szkriptben volt, és egy végrehajtható fájl letöltését végezte egy külső forrásból. a szerver. A letöltött fájl Unix rendszereken /tmp/rust-setup néven, míg Windows alatt %TEMP%\rust-setup.ps1 vagy %TEMP%\rust-setup-launch.vbs néven lett mentve.
Forrás: opennet.ru
