È stato pubblicato il rilascio del linguaggio di programmazione Rust 1.91, originariamente sviluppato da Mozilla, ma attualmente gestito sotto l'egida della nonprofit Rust Foundation. Il linguaggio è focalizzato su un utilizzo sicuro della memoria e fornisce strumenti per raggiungere un alto parallelo nell'esecuzione dei task, evitando l'uso di un garbage collector e di un runtime (il runtime si limita a una base inizializzazione e al supporto della libreria standard).
I metodi di gestione della memoria in Rust liberano gli sviluppatori dagli errori di manipolazione dei puntatori e li proteggono da problemi derivanti da operazioni a basso livello con la memoria, come l'accesso a aree di memoria dopo il loro rilascio, la dereferenziazione di puntatori nulli, l'uscita dai limiti del buffer, ecc. Per la distribuzione delle librerie, l'assicurazione della compilazione e la gestione delle dipendenze, il progetto promuove il gestore di pacchetti Cargo. È supportato un repository per l'hosting delle librerie su crates.io.
La gestione sicura della memoria in Rust è garantita durante la compilazione attraverso il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la considerazione del tempo di vita degli oggetti (ambiti di visibilità) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria 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 minimizzare gli errori logici.
Novità principali:
- Migliorato il supporto per i sistemi ARM a 64 bit con sistema operativo Windows. La piattaforma target "aarch64-pc-windows-msvc" è stata spostata dal secondo al primo livello di supporto. Garantito il secondo livello di supporto per le architetture aarch64-pc-windows-gnullvm e x86_64-pc-windows-gnullvm. Il primo livello di supporto implica la generazione di pacchetti binari, l'esecuzione di test approfonditi e la fornitura della massima garanzia di supporto della piattaforma: ogni modifica al compilatore viene verificata eseguendo un intero set di test. Il secondo livello di supporto include la generazione di pacchetti binari e la garanzia della costruzione, ma non garantisce il passaggio del set di test. Il terzo livello copre il supporto di base, ma senza test automatizzati, pubblicazione di versioni ufficiali e verifica della possibilità di compilazione del codice.
- Aggiunto il messaggio di avviso lint "dangling_pointers_from_locals" per rilevare il ritorno di puntatori raw pendenti (dangling raw pointer) da funzioni che puntano a dati memorizzati in variabili locali definite nella funzione chiamata. Tali variabili vengono rimosse al termine della funzione e i puntatori raw ai dati associati a queste variabili diventano pendenti, cioè puntano a memoria liberata. Una successiva dereferenziazione di un tale puntatore porta a un comportamento indefinito. fn f() -> *const u8 { let x = 0; &x // avviso: verrà prodotto un puntatore pendente poiché la variabile locale «x» verrà eliminata }
- Aggiunto il messaggio di avviso lint "integer_to_ptr_transmutes", che segnala la conversione di numeri interi in puntatori utilizzando la funzione std::mem::transmute.
- Nel gestore pacchetti Cargo è stata stabilizzata la supporto per il parametro "build.build-dir", che definisce la cartella per la memorizzazione degli artefatti di costruzione temporanei creati da cargo e rustc durante la fase di costruzione.
- Per ABI sysv64, win64, efiapi e aapcs, è stato stabilizzato il supporto alla dichiarazione di funzioni con un numero variabile di argomenti in stile C.
- È stato stabilizzato il supporto per l'assemblatore inline per l'architettura LoongArch32.
- Una nuova serie di API è stata trasformata in versioni stabili, inclusi i metodi stabilizzati e le implementazioni delle trait:
- Path::file_prefix
- AtomicPtr::fetch_ptr_add
- AtomicPtr::fetch_ptr_sub
- AtomicPtr::fetch_byte_add
- AtomicPtr::fetch_byte_sub
- AtomicPtr::fetch_or
- AtomicPtr::fetch_and
- AtomicPtr::fetch_xor
- {integer}::strict_add
- {integer}::strict_sub
- {integer}::strict_mul
- {integer}::strict_div
- {integer}::strict_div_euclid
- {integer}::strict_rem
- {integer}::strict_rem_euclid
- {integer}::strict_neg
- {integer}::strict_shl
- {integer}::strict_shr
- {integer}::strict_pow
- i{N}::aggiunta_strict_non_negativa
- i{N}::sottrazione_strict_non_negativa
- i{N}::valore_assoluto_strict
- u{N}::aggiunta_strict_signata
- u{N}::sottrazione_strict_signata
- PanicHookInfo::payload_as_str
- core::iter::chain
- u{N}::differenza_signata_verificata
- core::array::repeat
- PathBuf::add_extension
- PathBuf::with_added_extension
- Duration::from_mins
- Duration::from_hours
- impl PartialEq per PathBuf
- impl PartialEq per PathBuf
- impl PartialEq per Path
- impl PartialEq per Path
- impl PartialEq per String
- impl PartialEq per String
- impl PartialEq per str
- impl PartialEq per str
- Ipv4Addr::from_octets
- Ipv6Addr::from_octets
- Ipv6Addr::from_segments
- impl Default per Pin<Box> dove Box: Default, T: ?Sized
- impl Default per Pin<Rc> dove Rc: Default, T: ?Sized
- impl Default per Pin<Arc> dove Arc: Default, T: ?Sized
- Cell::as_array_of_cells
- u{N}::addizione_con_porto
- u{N}::sottrazione_con_preso
- u{N}::moltiplicazione_con_porto
- u{N}::moltiplicazione_con_porto_aggiunta
- BTreeMap::extract_if
- BTreeSet::extract_if
- impl Debug per windows::ffi::EncodeWide
- str::ceil_char_boundary
- str::floor_char_boundary
- impl Sum per Saturating
- impl Sum per Saturating
- impl Product per Saturating
- impl Product per Saturating
- Il segnale «const» è stato applicato nelle funzioni:
- ::each_ref
- ::each_mut
- OsString::new
- PathBuf::new
- TypeId::of
- ptr::with_exposed_provenance
- ptr::with_exposed_provenance_mut
- Il compilatore è stato aggiornato alla branch LLVM 21.
Fonte: opennet.ru
