In Rust, il casting dei tipi (type casting) è effettuato mediante la parola chiave as. Essa esegue una conversione esplicita da un tipo a un altro:
let x: i32 = 10; let y: u8 = x as u8;
Rust non esegue conversioni implicite (implicit cast), a differenza di C o C++. Questo previene molti errori legati alla perdita di dati o overflow.
Caratteristiche:
Potenziali rischi:
i32 a u8, se il valore supera il range, i bit superiori vengono semplicemente scartati — ciò può portare a comportamenti imprevisti.Esempio:
let big: u16 = 300; let small: u8 = big as u8; // small == 44, poiché 300 % 256 = 44
Cosa succede se si effettua il casting di un numero negativo di tipo
i8a tipou8usando la parola chiaveas?
Risposta: Il valore non genera errori di compilazione o panico durante l'esecuzione. Invece, i bit del valore vengono interpretati come un numero senza segno:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
Storia
In un'applicazione finanziaria, i dati sui trasferimenti di denaro venivano inizialmente memorizzati come i32. Un sviluppatore ha deciso di convertirli in u32 senza controllare i limiti, il che ha portato a una gestione errata dei valori negativi — le somme diventavano inaspettatamente grandi numeri positivi, superando la logica aziendale!
Storia
In un gioco per microcontrollori, il cambio dei livelli di accelerazione veniva calcolato come la differenza di due valori di livello: il risultato poteva essere negativo. È stato usato il casting as u8 per arrotondare il risultato, ignorando gli overflow. Di conseguenza, le velocità si bloccavano al livello massimo, poiché i valori negativi venivano convertiti in grandi valori positivi a causa del comportamento di wrap-around.
Storia
In un'applicazione di rete, quando si copiava un buffer di dati, la lunghezza veniva calcolata come la differenza di puntatori (usize), e poi convertita in u32 usando as. Con grandi volumi di memoria (>4 GB), ciò portava a un'accorciamento del valore, causando la perdita di dati e errori nella trasmissione di file di grandi dimensioni.