📊 Capítulo 19: Unsafe Rust & FFI com C
Especialização em Sistemas com Rust
🗺️ A Fronteira entre o Mundo Safe e Unsafe
flowchart LR
SAFE["Safe Rust (99% do Código / Garantias do Compilador)"]
--> BORDER["Barreira de Abstração Segura"]
BORDER --> UNSAFE["unsafe { ... } (Os 5 Superpoderes)"]
UNSAFE --> RAW["1. Desreferenciar Raw Pointers (*const T, *mut T)"]
UNSAFE --> FFI["2. Chamar funções externas C FFI (extern 'C')"]
UNSAFE --> MUT_STATIC["3. Modificar variáveis estáticas mutáveis"]
UNSAFE --> UNSAFE_TRAIT["4. Implementar unsafe traits"]
style SAFE fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style BORDER fill:#fff3e0,stroke:#ff9800,stroke-width:2px
style UNSAFE fill:#ffebee,stroke:#d32f2f,stroke-width:2px
style RAW fill:#ede7f6,stroke:#512da8,stroke-width:1.5px
style FFI fill:#ede7f6,stroke:#512da8,stroke-width:1.5px
style MUT_STATIC fill:#ede7f6,stroke:#512da8,stroke-width:1.5px
style UNSAFE_TRAIT fill:#ede7f6,stroke:#512da8,stroke-width:1.5px
🎯 Slide 1: Por Que o Rust Possui unsafe?
-
O hardware do computador é fundamentalmente inseguro (drivers de dispositivo, DMA, alocadores de memória).
- Princípio do Encapsulamento: O Rust permite que você escreva um núcleo pequeno em
unsafee o envolva em uma API 100% segura (Safe Wrapper).
🎯 Slide 2: Ponteiros Brutos (*const T & *mut T)
let mut valor = 42;
let p1: *const i32 = &valor;
let p2: *mut i32 = &mut valor;
unsafe {
println!("Valor via raw pointer: {}", *p1);
*p2 = 100;
}
- Ponteiros brutos podem ser nulos, desalinhados e ignoram completamente o borrow checker.
🎯 Slide 3: Chamando Bibliotecas C Nativas (FFI)
extern "C" {
fn puts(s: *const i8) -> i32;
}
fn main() {
let msg = c"Olá diretamente da libc!".as_ptr();
unsafe {
puts(msg);
}
}
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim