2015-03-14 11 views
6

Quando è necessario contrassegnare una funzione come unsafe rispetto all'uso di un blocco unsafe? Ho visto questa funzione durante la lettura another answer:Come si decide quando contrassegnare una funzione come non sicura?

unsafe fn as_u8_slice(xs: &[i32]) -> &[u8] { 
    std::slice::from_raw_parts(v.as_ptr() as *const u8, 
           v.len() * std::mem::size_of::<i32>()) 
} 

probabilmente avrei scritto la funzione come:

fn as_u8_slice(xs: &[i32]) -> &[u8] { 
    unsafe { 
     std::slice::from_raw_parts(v.as_ptr() as *const u8, 
            v.len() * std::mem::size_of::<i32>()) 
    } 
} 

Cioè, mi sento come chiamando la funzione è sicuro in tutti i casi, ma che cosa la funzione internamente non può essere verificata dal compilatore. Tuttavia, non ho regole per quando è opportuno usare l'una o l'altra.

+3

il fatto che "chiamare la funzione è sicuro in tutti i casi" dovrebbe essere il criterio preciso. –

risposta

11

Contrassegnare una funzione come unsafe se la sicurezza della funzione dipende dai suoi parametri o dallo stato globale. Se la funzione è sicura indipendentemente dagli argomenti e dallo stato globale, non contrassegnarla come unsafe. Se si considera una funzione che utilizza lo standard unsafe al sicuro è la stessa che si consideri un programma C sicuro.

4

unsafe è progettato come un meccanismo locale per aggirare il sistema di tipi quando il compilatore non è in grado di dimostrare la sicurezza. Se il comportamento incapsulato da unsafe è sicuro, ovvero non c'è modo di chiamarlo che causerà la mancata sicurezza della memoria, non è necessario etichettare la funzione generale non sicura. L'utente non deve preoccuparsi se gli interni della funzione sono implementati interamente con codice di sicurezza o con unsafe, purché l'interfaccia esposta sia corretta.

Problemi correlati