Noções Básicas de unsafe
7 exemplos - 5 básicos, 2 intermediários - para o escopo da palavra-chave unsafe.
Pré-requisitos
Exemplos Básicos
1. Bloco unsafe
fn main() {
let v = 42;
let p = &v as *const i32;
let val = unsafe { *p };
println!("{val}");
}- Desreferenciar um ponteiro bruto requer
unsafe - O programador afirma a segurança
2. unsafe fn
unsafe fn dangerous() {
// o chamador deve manter os invariantes
}Chamar dangerous() requer unsafe { dangerous(); }.
3. unsafe trait
unsafe trait Trusted {}O implementador promete condições de segurança.
4. O que unsafe Permite
- Desreferenciar ponteiros brutos
- Chamar
unsafe fn - Acessar
static mut - Implementar
unsafe trait - Acesso a campos de
union
O verificador de empréstimo (borrow checker) ainda se aplica a código seguro.
5. O que unsafe NÃO Desabilita
- Propriedade e tempos de vida em referências seguras
- Sistema de tipos (não é possível lançar fora proteções livremente)
- A maior parte do Rust ainda é segura por padrão
Relacionado: Comportamento Indefinido
Exemplos Intermediários
6. Abstração Segura
fn split_at_mut<T>(slice: &mut [T], mid: usize) -> (&mut [T], &mut [T]) {
slice.split_at_mut(mid)
}A biblioteca padrão usa unsafe internamente - API segura.
7. Documentando a Segurança
/// # Safety
/// `ptr` deve ser válido para leituras de um `i32`.
unsafe fn read_int(ptr: *const i32) -> i32 {
*ptr
}Relacionado: Melhores Práticas de Rust
unsafe
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.