Limbajul de programare Rust 1.98, fondat de proiectul Mozilla, dar dezvoltat acum sub auspiciile organizației non-profit independente Rust Foundation, a fost lansat. Limbajul se concentrează pe siguranța memoriei și oferă instrumente pentru obținerea unui paralelism ridicat în execuția sarcinilor, renunțând în același timp la utilizarea unui colector de gunoi și a runtime-ului (runtime-ul este redus la inițializarea și întreținerea de bază a bibliotecii standard).
Metodele de gestionare a memoriei din Rust sunt concepute pentru a elimina erorile în manipularea pointerilor și pentru a proteja împotriva problemelor care apar din gestionarea memoriei de nivel scăzut, cum ar fi accesarea memoriei după ce aceasta a fost eliberată, dereferențierea pointerilor nuli, depășirea buffer-ului și așa mai departe. Proiectul dezvoltă managerul de pachete Cargo pentru a distribui biblioteci, a facilita compilările și a gestiona dependențele. Depozitul crates.io este întreținut pentru găzduirea bibliotecilor.
Siguranța memoriei este furnizată în Rust în timpul compilării prin verificarea referințelor, urmărirea proprietății obiectului, urmărirea duratelor de viață a obiectelor (sfere de aplicare) și evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, protecție împotriva depășirilor de numere întregi, necesită inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică implicit conceptul de referințe imuabile și variabile, oferă tastare statică puternică pentru a minimiza erorile logice.
Principalele inovații:
- Pentru tipurile cu virgulă mobilă f32 și f64, sunt implementate metode algebrice pentru adunare, scădere, înmulțire, împărțire și rest, implementând optimizări similare cu opțiunea „-ffast-math” din compilatoarele C/C++. Aceste metode permit schimbarea ordinii operațiilor atunci când este necesar pentru optimizări precum vectorizarea buclelor. De exemplu, atunci când se calculează „a + b + c + d” folosind adunarea obișnuită, compilatorul va efectua întotdeauna calculul în aceeași ordine: „((a + b) + c) + d”, dar folosind metoda algebraic_add, poate grupa expresia ca „(a + b) + (c + d)” și poate executa „(a + b)” și „(c + d)” în paralel folosind instrucțiuni SIMD. Prețul utilizării metodelor algebrice este nedeterminismul rezultatelor calculului, care poate varia în limita marjei de eroare.
- Toate tipurile primitive de numere întregi au o metodă „format_into” încorporată pentru convertirea numerelor în șiruri de caractere, care poate fi utilizată în locul pachetului itoa. Un buffer NumBuffer este transmis ca parametru. , a cărui dimensiune este garantată a fi suficientă pentru a scrie orice valoare de tipul utilizat în formă zecimală. Rezultatul este un șir formatat &str, a cărui durată de viață este legată de buffer.
- Interacțiunea dintre cablajul ManuallyDrop și indicatorul inteligent Box nu mai are ca rezultat un comportament nedefinit.
- O nouă porțiune a API-ului a fost mutată în categoria de stabil, inclusiv metodele și implementările de trăsături au fost stabilizate:
- str::substr_range
- [T]::subslice_range
- core::fmt::NumBuffer
- <{integer}>::format_into
- Trimitere/Sincronizare pentru std::process::CommandArgs
- {fN}::add_algebraic
- {fN}::algebraic_sub
- {fN}::algebraic_mul
- {fN}::div_algebrică
- {fN}::algebraic_rem
- NonZero<{integer}>::from_str_radix
- Șir de caractere::from_utf16le
- Șir de caractere::from_utf16le_lossy
- Șir de caractere::from_utf16be
- Șir de caractere::from_utf16be_lossy
- [T]::strip_circumfix
- str::strip_circumfix
- Atomic ::from_mut
- Atomic ::get_mut_slice
- Atomic ::from_mut_slice
- std::range::legacy
- Platformele țintă thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf și thumbv8r-none-eabihf au fost mutate la al doilea nivel de suport, care include o garanție de construire, dar nicio garanție de trecere a testelor.
- A fost adăugat suport pentru platformele powerpc64-unknown-linux-gnuelfv2 și aarch64-unknown-linux-pauthtest, care acum au nivelul 3 de suport. Nivelul 3 include suport de bază, dar nu include testarea automată, lansările oficiale de compilare sau verificarea compilarii.
În plus, popularul pachet crate arrayref, care a fost descărcat de peste 53 de milioane de ori în ultimele 90 de zile și este utilizat ca dependență de 403 pachete, a fost compromis. Atacatorii au postat în depozitul crates.io noi pachete care conțineau cod malițios: proc-macro1, proc-macro-en, aovine, arone, aronenao și tinymember. Ulterior, au fost publicate în depozit noi versiuni ale arrayref 0.3.10, internment 0.8.7 și append-only-vec 0.1.9, fiecare adăugând pachetul malițios proc-macro1 ca dependență. Versiunea malițioasă a pachetului arrayref a fost postată pe 20 august, la ora 10:15 AM (MSK) și a rămas activă până la ora 11:41 AM, după care a fost eliminată de administratorii crates.io.
Responsabilul cu gestionarea arrayref nu a fost încă contactat pentru a clarifica situația, dar se crede că datele sale de autentificare au fost interceptate de atacatori. În pachetul proc-macro1, o modificare rău intenționată era prezentă în scriptul de compilare și a încărcat un fișier executabil dintr-un director extern. ServerFișierul descărcat a fost salvat ca /tmp/rust-setup pe sistemele Unix și în Windows — %TEMP%\rust-setup.ps1 sau %TEMP%\rust-setup-launch.vbs.
Sursa: opennet.ru
