È stato rilasciato il linguaggio di programmazione di uso generale Rust 1.74, originariamente sviluppato da Mozilla e ora gestito dall'organizzazione non profit indipendente Rust Foundation. Il linguaggio è focalizzato sulla gestione sicura della memoria e offre strumenti per ottenere un elevato parallelismo nell'esecuzione delle attività, evitando l'uso di un garbage collector e di un runtime (il runtime si limita a una semplice inizializzazione e alla manutenzione della libreria standard).
I metodi di gestione della memoria in Rust liberano gli sviluppatori dagli errori nella manipolazione dei puntatori e li proteggono da problematiche derivanti dal lavoro a basso livello con la memoria, come l'accesso a zone di memoria dopo la loro liberazione, la dereferenziazione di puntatori nulli, il superamento dei limiti del buffer, e così via. Per la distribuzione delle librerie, la gestione della compilazione e delle dipendenze, si è sviluppato un gestore di pacchetti chiamato Cargo. Le librerie sono ospitate nel repository crates.io.
La gestione sicura della memoria in Rust è garantita durante la compilazione tramite il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la gestione della durata degli oggetti (scope) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust offre anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria dei valori delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di riferimenti e variabili immutabili per impostazione predefinita e offre una forte tipizzazione statica per ridurre al minimo gli errori logici.
Novità principali:
- È stata aggiunta la possibilità di configurare i controlli lint tramite il file Cargo.toml del gestore di pacchetti. Per definire le impostazioni dei controlli lint, come il livello di reazione (forbid, deny, warn, allow), sono state proposte nuove sezioni «[lints]» e «[workspace.lints]», i cui cambiamenti vengono considerati nel processo di ricompilazione. Ad esempio, invece di specificare durante la compilazione i flag «-F», «-D», «-W» e «-A» o di aggiungere nel codice gli attributi «#![forbid(unsafe_code)]» e «#![deny(clippy::enum_glob_use)]», ora è possibile utilizzare nel manifesto Cargo: [lints.rust] unsafe_code = «forbid» [lints.clippy] enum_glob_use = «deny»
- Nel gestore di pacchetti Crate è stata aggiunta la possibilità di autenticazione per la connessione al repository. Nella fornitura di base è inclusa la supporto per la memorizzazione dei parametri di autenticazione nei gestori delle credenziali di Linux (basato su libsecret), macOS (Keychain) e Windows (Windows Credential Manager), ma il sistema è inizialmente progettato in modo modulare e consente di organizzare il lavoro con vari provider per la memorizzazione e la generazione di token, ad esempio è stato preparato un plugin per l'uso del gestore di password 1Password. L'autenticazione può essere richiesta dal repository per qualsiasi operazione, non solo per la conferma della pubblicazione dei pacchetti. ~/.cargo/config.toml [registry] global-credential-providers = [«cargo:token», «cargo:libsecret»]
- È stata stabilizzata la supporto per le proiezioni dei tipi di ritorno (impl_trait_projections), consentendo di menzionare Self e T::Assoc nei tipi di ritorno, come «async fn» e «-> impl Trait». struct Wrapper(&'a T); // Tipi di ritorno opachi che menzionano `Self`: impl Wrapper { async fn async_fn() -> Self { /* … */ } fn impl_trait() -> impl Iterator { /* … */ } } trait Trait { type Assoc; fn new() -> Self::Assoc; } impl Trait for () { type Assoc = (); fn new() {} } // Tipi di ritorno opachi che menzionano un tipo associato: impl<'a, T: Trait> Wrapper { async fn mk_assoc() -> T::Assoc { /* … */ } fn a_few_assocs() -> impl Iterator { /* … */ } }
- Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
- L'indicatore «const», che determina la possibilità di utilizzo in qualsiasi contesto al posto delle costanti, è stato applicato nelle funzioni:
- core::mem::transmute_copy
- str::is_ascii
- [u8]::is_ascii
- core::num::Saturating
- impl From for std::process::Stdio
- impl From for std::process::Stdio
- impl From for std::process::Child{Stdin, Stdout, Stderr}
- impl From for std::process::Child{Stdin, Stdout, Stderr}
- std::ffi::OsString::from_encoded_bytes_unchecked
- std::ffi::OsString::into_encoded_bytes
- std::ffi::OsStr::from_encoded_bytes_unchecked
- std::ffi::OsStr::as_encoded_bytes
- std::io::Error::other
- impl TryFrom for u16
- impl From for Vec
- impl From for Vec
- impl From for Arc
- impl From for Rc
- Nel compilatore, negli strumenti, nella libreria standard e nei file eseguibili generati, sono aumentati i requisiti per le piattaforme Apple: ora sono necessarie almeno le versioni macOS 10.12 Sierra, iOS 10 e tvOS 10, rilasciate nel 2016.
- È stato implementato il terzo livello di supporto per la piattaforma i686-pc-windows-gnullvm. Il terzo livello implica un supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della possibilità di compilare il codice.
- È stata implementata la seconda fase di supporto per la piattaforma di destinazione loongarch64-unknown-none. Il secondo livello di supporto implica una garanzia di compilazione.
In aggiunta, si possono notare due eventi legati al linguaggio Rust:
- Il fondo OSTIF (Open Source Technology Improvement Fund), creato con l'obiettivo di migliorare la sicurezza dei progetti open source, ha pubblicato i risultati dell'audit del progetto RustVMM, che fornisce componenti per la creazione di ipervisori e monitor specifici per determinati compiti. di macchine virtuali (VMM). Il progetto coinvolge aziende come Intel, Alibaba, Amazon, Google, Linaro e Red Hat. Sulla base di RustVMM vengono sviluppati i hypervisor Intel Cloud Hypervisor e Dragonball. L'audit ha confermato l'elevata qualità del codice sorgente e l'uso in architettura e implementazione di approcci mirati a massimizzare la sicurezza. Durante l'audit sono state identificate 6 problematiche, che non hanno impatti diretti sulla sicurezza.
- Google ha presentato nella mailing list degli sviluppatori del kernel Linux una nuova implementazione del meccanismo di interprocess communication Binder, riscritta in Rust. La rifattorizzazione è stata effettuata nell'ambito di un progetto volto a migliorare la sicurezza, promuovere tecniche di programmazione sicura e aumentare l'efficacia nella rilevazione di problemi di gestione della memoria in Android (circa il 70% di tutte le vulnerabilità gravi rilevate in Android sono causate da errori nella gestione della memoria). L'implementazione di Binder in Rust ha raggiunto la parità funzionale con la versione originale in C, supera tutti i test AOSP (Android Open-Source Project) e può essere utilizzata per creare versioni funzionanti delle firmware. Le prestazioni di entrambe le implementazioni sono circa allo stesso livello (deviazioni nell'intervallo del -1,96% e +1,38%).
Fonte: opennet.ru
