No description
Find a file
2026-09-01 13:09:03 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:09:03 +02:00
src fix(047): pedagogical MINOR fixes 2026-09-01 13:09:03 +02:00
tests initial content 2026-09-01 13:09:00 +02:00
.gitignore Initial commit 2026-09-01 11:08:36 +00:00
Cargo.lock initial content 2026-09-01 13:09:00 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:09:03 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:09:03 +02:00
README.md fix(047): pedagogical MINOR fixes 2026-09-01 13:09:03 +02:00

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 T e *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 unsafe permite

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

  1. Implementar ler_raw_pointer dereferenciando *const T
  2. Implementar escrever_raw_pointer dereferenciando *mut T
  3. Implementar trocar_valores usando raw pointers
  4. Implementar dividir_slice em duas metades
  5. Implementar criar_vetor_unsafe — a função recebe um Vec<i32> já alocado; use raw pointers para manipular o buffer interno (ex.: as_mut_ptr()) e devolva o mesmo Vec
  6. Implementar acessar_estatica com static mut
  7. Implementar copiar_memoria com std::ptr::copy
  8. Implementar verificar_bounds_unsafe sem bounds checking

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • unsafe não desliga o borrow checker — apenas permite as 5 operações extras
  • Mantenha blocos unsafe o 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 fn só pode ser chamada dentro de blocos unsafe

Nota: Embora algumas funções (como dividir_slice, criar_vetor_unsafe, copiar_memoria e verificar_bounds_unsafe) possam ser implementadas com safe Rust, o objetivo desta lição é praticar a sintaxe unsafe. Tente usar raw pointers mesmo quando safe é possível.