Rilascio del linguaggio di programmazione Rust 1.58

È stato pubblicato il rilascio del linguaggio di programmazione generale Rust 1.58, originariamente sviluppato da Mozilla, ma ora gestito sotto l'egida della Rust Foundation, un'organizzazione indipendente e no-profit. Il linguaggio è focalizzato sulla gestione sicura della memoria, offre gestione automatica della memoria e fornisce strumenti per raggiungere un alto livello di parallelismo nell'esecuzione dei compiti, senza l'uso di un garbage collector e runtime (il runtime si limita a una base iniziale e alla manutenzione della libreria standard).

La gestione automatica della memoria in Rust solleva gli sviluppatori dagli errori nella manipolazione dei puntatori e protegge da problemi derivanti dal lavoro a basso livello con la memoria, come l'accesso a aree di memoria già liberate, la dereferenziazione di puntatori nulli, il superamento dei limiti di un buffer, ecc. Per la distribuzione delle librerie, la costruzione e la gestione delle dipendenze, è in fase di sviluppo il gestore di pacchetti Cargo. Per l'hosting delle librerie, è supportato il repository crates.io.

Novità principali:

  • Nei blocchi di formattazione delle stringhe, oltre alla già disponibile possibilità di sostituire variabili esplicitamente elencate dopo la stringa per numero e nome, è stata realizzata la possibilità di sostituire identificatori arbitrari aggiungendo nella stringa delle espressioni «{identificatore}». Ad esempio: // In precedenza erano supportate strutture: println!(«Hello, {}!», get_person()); println!(«Hello, {0}!», get_person()); println!(«Hello, {person}!», person = get_person()); // ora è possibile indicare let person = get_person(); println!(«Hello, {person}!»);

    Gli identificatori possono anche essere specificati direttamente nei parametri di formattazione. let (width, precision) = get_format(); for (name, score) in get_scores() { println!(«{name}: {score:width$.precision$}»); }

    La nuova sostituzione funziona in tutti i macro che supportano la definizione del formato della stringa, ad eccezione del macro «panic!» nelle versioni del linguaggio Rust 2015 e 2018, in cui panic!(«{ident}») viene trattato come una semplice stringa (nella versione Rust 2021, la sostituzione è attivata).

  • Il comportamento della struttura std::process::Command su piattaforme Windows è stato modificato; durante l'esecuzione di comandi, per motivi di sicurezza, non vengono più cercati i file eseguibili nella directory corrente. Questo percorso è stato escluso poiché potrebbe essere sfruttato per eseguire codice malevolo in caso di avvio di programmi in directory non fidate (CVE-2021-3013). La nuova logica per individuare i file eseguibili prevede la ricerca nelle directory di Rust, nella directory dell'applicazione, nella directory di sistema di Windows e nelle directory indicate nella variabile d'ambiente PATH.
  • Nella libreria standard è stato ampliato il numero di funzioni contrassegnate con «#[must_use]» per emettere un avviso nel caso venga ignorato il valore di ritorno, ciò aiuta a rilevare errori derivanti dall'assunzione che una funzione modifichi i valori piuttosto che restituisca un nuovo valore.
  • Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
    • Metadata::is_symlink
    • Path::is_symlink
    • {integer}::saturating_div
    • Option::unwrap_unchecked
    • Result::unwrap_unchecked
    • Result::unwrap_err_unchecked
  • L'indicatore «const», che determina la possibilità di utilizzo in qualsiasi contesto al posto delle costanti, è stato applicato nelle funzioni:
    • Duration::new
    • Duration::checked_add
    • Duration::saturating_add
    • Duration::checked_sub
    • Duration::saturating_sub
    • Duration::checked_mul
    • Duration::saturating_mul
    • Duration::checked_div
  • È consentito dereferenziare puntatori «*const T» nei contesti «const».
  • Nel gestore di pacchetti Cargo è stato aggiunto un campo rust_version nei metadati del pacchetto, e nel comando «cargo install» è stata aggiunta l'opzione «—message-format».
  • Il compilatore implementa il supporto per il meccanismo di protezione CFI (Control Flow Integrity), che aggiunge un controllo prima di ogni chiamata indiretta a una funzione per rilevare alcune forme di comportamento indefinito, che potrebbero potenzialmente compromettere l'ordine normale di esecuzione (control flow) a causa dell'uso di exploit che alterano i puntatori alle funzioni memorizzati in memoria.
  • Nel compilatore è stato aggiunto il supporto per la 5ª e la 6ª versione del formato di copertura di corrispondenza LLVM, utilizzato per valutare la copertura del codice durante i test.
  • Nel compilatore i requisiti per la versione minima di LLVM sono stati elevati a LLVM 12.
  • È stato implementato il terzo livello di supporto per la piattaforma x86_64-unknown-none. Il terzo livello prevede un supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della possibilità di costruire il codice.

In aggiunta, possiamo menzionare la pubblicazione da parte di Microsoft delle librerie Rust for Windows 0.30, che consentono l'utilizzo del linguaggio Rust per lo sviluppo di applicazioni per il sistema operativo Windows. Il pacchetto include due crate (windows e windows-sys), attraverso i quali è possibile accedere all'API di Win nei programmi scritti in Rust. Il codice per il supporto dell'API viene generato dinamicamente dai metadati che descrivono l'API, consentendo non solo il supporto per le chiamate esistenti dell'API di Win, ma anche per quelle che verranno in futuro. Nella nuova versione è stata aggiunta la supporto per la piattaforma target UWP (Universal Windows Platform), implementando le tipologie Handle e Debug.

Fonte: opennet.ru

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