Boas Práticas de Rust Inseguro
Como Usar Esta Lista
- Padrão: sem
unsafenovo. Requer revisão de design + plano Miri. - Inventariar todo
unsafeno repositório trimestralmente.
A - Quando Usar
- Tentar refatoração segura primeiro. Índices,
split_at_mut, APIsstd. - Usar crates estabelecidos (
bytes,zerocopy) antes deunsafecustomizado. Testados em batalha. - Isolar FFI em módulos dedicados. Superfície de auditoria única.
- Documentar invariantes em cada
unsafe fne bloco. Seção# Safety. - Preferir tipos wrapper seguros em vez de
pub unsafe fn. Mais difícil de usar incorretamente.
B - Correção
- Executar
cargo miri testem nightly para mudançasunsafe. Trabalho agendado no CI. - Nunca desreferenciar ponteiros brutos nulos ou pendentes. Verificações de validade.
- Inicializar memória antes de ler (
MaybeUninit). Semassume_initprematuro. - Usar
repr(C)apenas com layout documentado para FFI.cbindgen/bindgen. - Capturar panics na fronteira FFI (
catch_unwind). Não descompactar para C.
C - Processo
- Revisão de código obrigatória por um segundo revisor com conhecimento de
unsafe. Sem merge solo. - Manter blocos
unsafemínimos - uma linha, se possível. Escopo estreito. - Rastrear
unsafeem ADR quando for arquitetural. Mantenedores futuros. - Fuzzizar parsers usando buffers
unsafe.cargo-fuzzpara entradas. - Negar
unsafeem código de aplicação se a política permitir - apenas no limite do crate.
D - Ferramentas
- Habilitar
clippy pedanticem módulosunsafe. Lints extras. - ASan/TSan para builds mistos Rust/C. Testes de linkage nativo.
- Evitar
static mut- usarOnceLock, atômicos, mutex. Orientação Rust 2024. - Auditar uso de
transmute,from_raw_parts,unchecked. APIs de alto risco. - Re-executar Miri após atualizações de dependência que tocam em
unsafe.
FAQs
aplicativo zero unsafe?
Objetivo válido para equipes de lógica de negócios.quem pode escrever unsafe?
Subconjunto treinado + revisão.unsafe em testes?
Ok se o Miri cobrir.permitir lint unsafe_code?
Atributo de crate `#![deny(unsafe_code)]`.segurança do bindgen?
Todo `extern` precisa de wrapper.asm inline?
Documentar clobbers completamente.no_std unsafe?
Mais comum - cuidado extra.miri perdeu ub?
Ainda precisa de revisão humana.semver unsafe?
API `unsafe` ainda é contrato público.aprender mais?
Rustonomicon, capítulo UB do Rust Reference.Relacionados
- Noções Básicas de Unsafe
- Miri & Sanitizers
- Abstrações Sólidas sobre Unsafe
- Boas Práticas de FFI de Sistemas
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+.