No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Lição 47: Unsafe Rust (Modo Combate)
1. Narrativa
Quando o mecha entra em modo combate, os sistemas de segurança são desativados para máxima performance. Unsafe Rust é exatamente isso: o compilador desativa certas verificações e confia no piloto. É poderoso, mas perigoso — com grande poder vem grande responsabilidade. O piloto deve garantir manualmente a segurança que o compilador não pode verificar.
2. Conceito
Unsafe Rust permite 5 superpoderes que o Rust safe não permite:
- Dereferenciar raw pointers:
*const Te*mut T - Chamar funções unsafe: Incluindo funções FFI (C)
- Acessar/modificar variáveis estáticas mutáveis:
static mut - Implementar unsafe traits: Traits com invariantes manuais
- Acessar campos de union: Tipos como unions do C
3. Requisitos
- Usar blocos
unsafe {}corretamente - Dereferenciar raw pointers
- Criar e usar funções
unsafe fn - Entender os limites do que
unsafepermite
4. Design de Dados
graph LR
A[Safe Rust] -->|unchecked| B[Unsafe Block]
B --> C[Raw Pointers]
B --> D[Unsafe Fns]
B --> E[Static Mut]
B --> F[Unsafe Traits]
5. Diagrama de Fluxo
flowchart TD
A[Safe Context] --> B[Precisa de unsafe?]
B -->|Sim| C[unsafe block]
C --> D{Invariante mantido?}
D -->|Sim| E[Operação executada]
D -->|Não| F[Comportamento indefinido!]
B -->|Não| G[Código safe]
6. Funções
| Função | Descrição |
|---|---|
ler_raw_pointer |
Lê valor via raw pointer |
escrever_raw_pointer |
Escreve valor via raw pointer mutável |
trocar_valores |
Troca dois valores usando raw pointers |
dividir_slice |
Divide slice em duas partes usando raw pointers |
criar_vetor_unsafe |
Cria Vec usando manipulação de memória |
acessar_estatica |
Acessa variável estática mutável |
copiar_memoria |
Copia bytes entre regiões de memória |
verificar_bounds_unsafe |
Acesso sem bounds checking |
7. Exemplo
let x = 42;
let ptr: *const i32 = &x as *const i32;
unsafe {
assert_eq!(*ptr, 42);
}
8. Missão
- Implementar
ler_raw_pointerdereferenciando*const T - Implementar
escrever_raw_pointerdereferenciando*mut T - Implementar
trocar_valoresusando raw pointers - Implementar
dividir_sliceem duas metades - Implementar
criar_vetor_unsafe— a função recebe umVec<i32>já alocado; use raw pointers para manipular o buffer interno (ex.:as_mut_ptr()) e devolva o mesmoVec - Implementar
acessar_estaticacomstatic mut - Implementar
copiar_memoriacomstd::ptr::copy - Implementar
verificar_bounds_unsafesem bounds checking
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
unsafenão desliga o borrow checker — apenas permite as 5 operações extras- Mantenha blocos
unsafeo menor possível - Documente POR QUE o código é seguro, não apenas o que ele faz
- Raw pointers podem ser null — valide antes de dereferenciar
unsafe fnsó pode ser chamada dentro de blocosunsafe
Nota: Embora algumas funções (como
dividir_slice,criar_vetor_unsafe,copiar_memoriaeverificar_bounds_unsafe) possam ser implementadas com safe Rust, o objetivo desta lição é praticar a sintaxeunsafe. Tente usar raw pointers mesmo quando safe é possível.