A fost publicat release-ul limbajului de programare Rust 1.98, inițial dezvoltat de proiectul Mozilla, dar acum crescut sub auspiciile organizației non-profit independente Rust Foundation. Limbajul se concentrează pe lucrul sigur cu memoria și oferă instrumente pentru a realiza un înalt grad de paralelism în executarea sarcinilor, reușind să funcționeze fără un colector de gunoi și runtime (runtime-ul se rezumă la inițializarea de bază și întreținerea bibliotecii standard).
Metodele de gestionare a memoriei în Rust sunt orientate spre eliminarea erorilor în manipularea pointerilor și protejarea împotriva problemelor care apar din lucrul la nivel de memorie, cum ar fi accesarea unei zone de memorie după eliberarea ei, dereferentierea pointerilor nuli, depășirea limitelor buffer-ului etc. Pentru distribuirea bibliotecilor, asigurarea compilării și gestionarea dependențelor, proiectul se dezvoltă cu ajutorul managerului de pachete Cargo. Un depozit pentru biblioteci este susținut la crates.io.
Lucrul sigur cu memoria este asigurat în Rust în timpul compilării prin verificarea referințelor, urmărirea proprietății obiectelor, luarea în considerare a timpului de viață al obiectelor (domeniul de vizibilitate) și evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, instrumente pentru protejarea împotriva suprasaturării numerice, impune inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică conceptul de referințe și variabile imutabile (immutable) din oficiu și oferă o tipizare statică puternică pentru a minimiza erorile logice.
Noutăți principale:
- Pentru tipurile cu puncte mobile f32 și f64, au fost implementate metodele algebrice pentru adunare, scădere, înmulțire, împărțire și găsirea restului, care realizează o optimizare similară opțiunii „-ffast-math” din compilatoarele C/C++. Aceste metode permit modificarea ordinii operațiunilor, atunci când este necesar, pentru optimizări, cum ar fi vectorizarea buclelor. De exemplu, în calculul „a + b + c + d”, utilizând adunarea obișnuită, compilatorul va efectua întotdeauna calculul într-o anumită ordine „((a + b) + c) + d”, în timp ce utilizând metoda algebraic_add poate grupa expresia ca „(a + b) + (c + d)” și poate executa „(a + b)” și „(c + d)” în paralel prin instrucțiuni SIMD. Prețul aplicării metodelor algebrice este nedeterminarea rezultatelor calculului, care pot varia în limitele erorii.
- Pentru toate tipurile primitive întregi, a fost implementată metoda încorporată „format_into” pentru transformarea numerelor în șiruri, care poate fi utilizată în locul pachetului itoa. Ca parametru se transmite un buffer NumBuffer<Self>, dimensiunea căruia este garantată că este suficientă pentru a înregistra orice valoare a tipului utilizat în format zecimal. La ieșire se returnează un șir formatat &str, al cărui timp de viață este legat de buffer.
- Interacțiunea dintre învelișul ManuallyDrop și pointerul inteligent Box nu mai conduce acum la comportamente nedeterminate.
- O nouă porțiune de API a fost transformată în stabilitate, inclusiv metode și implementări ale tiparelor stabilize.
- str::substr_range
- [T]::subslice_range
- core::fmt::NumBuffer
- <{integer}>::format_into
- Send/Sync pentru 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
- Platformele țintă thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf și thumbv8r-none-eabihf au fost transformată la al doilea nivel de suport, care implică o garanție de construcție, dar fără garanții în timpul trecerii testelor.
- A fost adăugat suport pentru platformele powerpc64-unknown-linux-gnuelfv2 și aarch64-unknown-linux-pauthtest, pentru care este asigurat un al treilea nivel de suport. Al treilea nivel acoperă suportul de bază, dar fără testare automatizată, publicarea construcțiilor oficiale și verificarea posibilității de construcție a codului.
De asemenea, se poate menționa compromiterea popularului pachet crate arrayref, care a avut peste 53 de milioane de descărcări în ultimele 90 de zile și este utilizat ca dependență de 403 pachete. Atacatorii au postat în depozitul crates.io noi pachete proc-macro1, proc-macro-en, aovine, arone, aronenao și tinymember, care conțin cod malițios. După aceea, au fost publicate noi versiuni ale pachetelor arrayref 0.3.10, internment 0.8.7 și append-only-vec 0.1.9, în care a fost adăugată ca dependență pachetul malițios proc-macro1. Versiunea malițioasă a pachetului arrayref a fost postată pe 20 august la 10:15 (MSK) și a existat până la 11:41, după care a fost eliminată de administratorii crates.io.
Nu s-a reușit contactarea dezvoltatorului arrayref pentru a clarifica situația, dar se presupune că acreditivele acestuia au fost interceptate de atacatori. În pachetul proc-macro1, modificarea malițioasă era prezentă în scriptul de construire și descărca un fișier executabil de la un exterior. server. Fișierul descărcat în sistemele Unix era salvat ca /tmp/rust-setup, iar în Windows – %TEMP%\rust-setup.ps1 sau %TEMP%\rust-setup-launch.vbs.
Sursa: opennet.ro
