Rilascio del linguaggio di programmazione Rust 1.58

È stata pubblicata la versione del linguaggio di programmazione generico Rust 1.58, fondato dal progetto Mozilla, ma ora sviluppato sotto l'egida dell'organizzazione no-profit indipendente Rust Foundation. Il linguaggio si concentra sulla sicurezza della memoria, fornisce la gestione automatica della memoria e fornisce i mezzi per ottenere un elevato parallelismo delle attività senza utilizzare un garbage collector o un runtime (il runtime è ridotto all'inizializzazione di base e alla manutenzione della libreria standard).

La gestione automatica della memoria di Rust elimina gli errori durante la manipolazione dei puntatori e protegge dai problemi derivanti dalla manipolazione della memoria di basso livello, come l'accesso a una regione di memoria dopo che è stata liberata, dereferenziazioni di puntatori nulli, sovraccarichi del buffer, ecc. Per distribuire le librerie, garantire l'assemblaggio e gestire le dipendenze, il progetto sta sviluppando il gestore di pacchetti Cargo. Il repository crates.io è supportato per ospitare le librerie.

Principali innovazioni:

  • Nei blocchi di formattazione delle righe, oltre alla possibilità precedentemente disponibile di sostituire le variabili esplicitamente elencate dopo una riga per numero e nome, viene implementata la possibilità di sostituire identificatori arbitrari aggiungendo l'espressione “{identifier}” alla riga. Ad esempio: // Costruzioni supportate in precedenza: println!("Ciao, {}!", get_person()); println!("Ciao, {0}!", get_person()); println!("Ciao, {persona}!", persona = get_person()); // ora puoi specificare let person = get_person(); println!("Ciao, {persona}!");

    Gli identificatori possono anche essere specificati direttamente nelle opzioni di formattazione. let (larghezza, precisione) = get_format(); for (nome, punteggio) in get_scores() { println!("{nome}: {score:width$.precision$}"); }

    La nuova sostituzione funziona in tutte le macro che supportano la definizione del formato stringa, ad eccezione della macro “panic!”. nelle versioni 2015 e 2018 del linguaggio Rust, in cui panico!("{ident}") viene trattato come una stringa regolare (in Rust 2021 la sostituzione funziona).

  • È stato modificato il comportamento della struttura std::process::Command sulla piattaforma Windows in modo che durante l'esecuzione dei comandi, per motivi di sicurezza, non cerchi più i file eseguibili nella directory corrente. La directory corrente è esclusa perché potrebbe essere utilizzata per eseguire codice dannoso se i programmi vengono eseguiti in directory non attendibili (CVE-2021-3013). La nuova logica di rilevamento degli eseguibili prevede la ricerca nelle directory di Rust, nella directory dell'applicazione, nella directory di sistema di Windows e nelle directory specificate nella variabile d'ambiente PATH.
  • La libreria standard ha ampliato il numero di funzioni contrassegnate con "#[must_use]" per emettere un avviso se il valore restituito viene ignorato, il che aiuta a identificare gli errori causati dal presupposto che una funzione cambierà valori anziché restituire un nuovo valore.
  • Una nuova porzione dell'API è stata spostata nella categoria stabile, inclusi i metodi e le implementazioni dei tratti sono stati stabilizzati:
    • Metadati::is_symlink
    • Percorso::is_link simbolico
    • {intero}::saturating_div
    • Opzione::unwrap_unchecked
    • Risultato::unwrap_unchecked
    • Risultato::unwrap_err_deselezionato
  • L'attributo "const", che determina la possibilità di utilizzarlo in qualsiasi contesto al posto delle costanti, viene utilizzato nelle funzioni:
    • Durata::nuovo
    • Durata::checked_add
    • Durata::saturating_add
    • Durata::checked_sub
    • Durata::saturating_sub
    • Durata::checked_mul
    • Durata::saturating_mul
    • Durata::checked_div
  • È consentito il dereferenziamento dei puntatori "*const T" in contesti "const".
  • Nel gestore dei pacchetti Cargo, il campo ruggine_version è stato aggiunto ai metadati del pacchetto e l'opzione “--message-format” è stata aggiunta al comando “cargo install”.
  • Il compilatore implementa il supporto al meccanismo di protezione CFI (Control Flow Integrity), che aggiunge controlli prima di ogni chiamata indiretta per rilevare alcune forme di comportamento non definito che potrebbero potenzialmente portare ad una violazione del normale ordine di esecuzione (flusso di controllo) a seguito del utilizzo di exploit che modificano i puntatori archiviati in memoria sulle funzioni.
  • Il compilatore ha aggiunto il supporto per le versioni 5 e 6 del formato di confronto della copertura LLVM, utilizzato per valutare la copertura del codice durante i test.
  • Nel compilatore, i requisiti per la versione minima di LLVM vengono elevati a LLVM 12.
  • È stato implementato il terzo livello di supporto per la piattaforma x86_64-unknown-none. Il terzo livello prevede il supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della costruibilità del codice.

Inoltre, segnaliamo la pubblicazione da parte di Microsoft del rilascio delle librerie Rust per Windows 0.30, che consentono di utilizzare il linguaggio Rust per sviluppare applicazioni per il sistema operativo Windows. Il set include due pacchetti Crate (windows e windows-sys), attraverso i quali è possibile accedere all'API Win nei programmi Rust. Il codice per il supporto API viene generato dinamicamente dai metadati che descrivono l'API, il che consente di implementare il supporto non solo per le chiamate API Win esistenti, ma per le chiamate che appariranno in futuro. La nuova versione aggiunge il supporto per la piattaforma di destinazione UWP (Universal Windows Platform) e implementa i tipi Handle e Debug.

Fonte: opennet.ru

Aggiungi un commento