extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
unsafe {
println!("Absolute value of -3 according to C: {}", abs(-3));
}
}
Todas as chamadas feitas às funções expostas por meio do extern "C"
o bloco deve ser envolvido em unsafe
para garantir que você assuma a devida responsabilidade pelo que você envia e recebe de volta.
Alterando variáveis estáticas mutáveis
Variáveis globais ou estáticas em Rust podem ser definidas como mutable
uma vez que ocupam um endereço de memória fixo. No entanto, só é possível modificar uma variável estática mutável dentro de uma unsafe
bloquear.
As corridas de dados são o maior motivo pelo qual você precisa unsafe
para alterar variáveis estáticas mutáveis. Você obteria resultados imprevisíveis se permitisse que a mesma variável estática mutável fosse modificada de diferentes threads. Então, embora você possa usar unsafe
para fazer tais mudanças, quaisquer problemas de corrida de dados seriam de sua responsabilidade, não da Rust. Em geral, a Rust não pode impedir totalmente as corridas de dados, mas você precisa ser duplamente cauteloso sobre isso unsafe
blocos.