Uscita di Rust 1.93. Progetti Rex, Fjall 3 e Arti 1.9.0

È stata pubblicata la release del linguaggio di programmazione Rust 1.93, originariamente sviluppato da Mozilla, ma ora gestito sotto l'egida dell'organizzazione no-profit indipendente Rust Foundation. Il linguaggio è focalizzato sulla gestione sicura della memoria e fornisce strumenti per raggiungere un alto grado di parallelismo nell'esecuzione dei compiti, il tutto senza ricorrere a un garbage collector e a un runtime (il runtime si limita all'inizializzazione di base e alla gestione 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:

  • La libreria standard C Musl, inclusa nella fornitura di Rust, utilizzata per il linking statico sulle piattaforme target «*-linux-musl» (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl, ecc.) su sistemi privi di Musl, è stata aggiornata alla versione 1.2.5. Anche la versione minima supportata di Musl per il linking dinamico è stata elevata alla release 1.2.5. In precedenza, Rust era basato su Musl 1.2.3, che presentava problemi nella realizzazione del risolutore DNS. Nella versione Musl 1.2.4 è stata aggiunta al risolutore DNS la possibilità di inviare una richiesta tramite TCP in caso di errore nella chiamata via UDP, risolvendo così il problema con le richieste di grandi record DNS e migliorando la compatibilità con i server DNS ricorsivi che non supportano la restituzione di parte del risultato in risposte UDP troncate. Nella versione Musl 1.2.5 è stata implementata la gestione delle risposte con lunghe sequenze CNAME nel risolutore DNS e risolto un problema che comportava l'ignoranza di alcune risposte grandi trasmesse tramite TCP.
  • La libreria standard è stata ristrutturata per risolvere i problemi di ri-entrabilità quando utilizzata in allocator di memoria globali, scritti in Rust, usano il macro std::thread_local! e la funzione std::thread::current, che portavano a ricorsioni infinite. Per escludere la situazione in cui std::thread_local! e std::thread::current chiamano lo stesso allocatore in cui vengono utilizzati durante il tentativo di allocare memoria, ora viene applicato direttamente il meccanismo di allocazione della memoria del sistema.
  • All'interno dei blocchi «asm!» con codice assembly è consentito l'uso degli attributi «cfg», il che consente, ad esempio, di gestire l'attivazione di set di istruzioni CPU estesi nel contesto di singole espressioni all'interno di un blocco asm (in precedenza, gli attributi «cfg» potevano essere specificati solo per l'intero blocco asm). asm!( // o global_asm! o naked_asm! «nop», #[cfg(target_feature = «sse2»)] «nop», // … #[cfg(target_feature = «sse2»)] a = const 123, // utilizzato solo su sse2 );
  • Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
    • <[MaybeUninit]>::assume_init_drop
    • <[MaybeUninit]>::assume_init_ref
    • <[MaybeUninit]>::assume_init_mut
    • <[MaybeUninit]>::write_copy_of_slice
    • <[MaybeUninit]>::write_clone_of_slice
    • String::into_raw_parts
    • Vec::into_raw_parts
    • ::unchecked_neg
    • ::unchecked_shl
    • ::unchecked_shr
    • ::unchecked_shl
    • ::unchecked_shr
    • ::as_array
    • ::as_array_mut
    • ::as_array
    • ::as_mut_array
    • VecDeque::pop_front_if
    • VecDeque::pop_back_if
    • Duration::from_nanos_u128
    • char::MAX_LEN_UTF8
    • char::MAX_LEN_UTF16
    • std::fmt::from_fn
    • std::fmt::FromFn
  • La piattaforma target «riscv64a23-unknown-linux-gnu» è stata portata al secondo livello di supporto, che implica la garanzia di compilazione, ma non garanzie sul superamento del set di test.

In aggiunta, si possono evidenziare alcuni progetti correlati a Rust:

  • Per il kernel Linux è in fase di sviluppo il framework Rex, che consente di creare estensioni per il kernel Linux utilizzando il linguaggio Rust, le quali possono essere utilizzate per espandere le funzionalità del kernel al posto di eBPF. Rex fornisce le stesse garanzie di sicurezza di eBPF, ma utilizza le capacità del linguaggio Rust e un Runtime leggero per isolamento e sicurezza. Per questi programmi non viene applicato un verificatore e i programmi vengono compilati in codice nativo dal compilatore Rust.

    Nei programmi Rex è consentito utilizzare un sottoinsieme del linguaggio Rust, che fornisce garanzie di sicurezza. Attualmente sono supportati 5 tipi di programmi eBPF: kprobe, perf_event, tracepoint, xdp e tc. È possibile chiamare funzioni di supporto eBPF, interagire con le strutture mappa eBPF, gestire le risorse del kernel, gestire le eccezioni e utilizzare i wrapper e le astratti sulle strutture del kernel.

  • È disponibile il rilascio Fjall 3, uno storage incorporato scritto in Rust che lavora con dati in formato chiave-valore. La memorizzazione dei dati avviene sotto forma di log utilizzando un albero LSM (Log-Structured-Merge), simile a RocksDB, in cui le modifiche vengono registrate aggiungendo dati alla fine del file. Per accedere al DB viene proposto un API in stile BTreeMap. Sono supportate funzionalità come spazi dei nomi, ricerca diretta e inversa per intervalli, compressione integrata, transazioni serializzabili, memorizzazione separata di chiavi e valori molto grandi associati, e manutenzione automatica in background del DB. Il codice è open source sotto licenza Apache 2.0.
  • Il progetto Tor ha pubblicato la versione Arti 1.9.0, un'implementazione dello strumento Tor scritta in Rust. Quando il codice di Arti raggiungerà un livello in grado di sostituire completamente la versione in C, gli sviluppatori di Tor intendono elevare Arti a implementazione principale di Tor e gradualmente interrompere il supporto per la versione in C. Nella nuova versione è proseguita l'implementazione delle funzionalità per i relay e server le directory (Directory Authority), è migliorato il supporto per l'uso di porte assegnate dinamicamente (proxy.socks_listen = «auto»), è stato aggiunto un API sperimentale per la gestione delle chiavi per i servizi onion.

Fonte: opennet.ru

Acquista un hosting affidabile per siti con protezione DDoS, server VPS VDS 🔥 Acquista un hosting affidabile per siti con protezione DDoS, server VPS VDS | ProHoster