Níveis e Atributos de Lint
Lints do Rust podem ser permitidos (allow), avisados (warn), negados (deny) ou proibidos (forbid) em nível de crate, módulo ou item. As tabelas [lints] do Cargo.toml centralizam a política para rustc e clippy.
Receita
[lints.rust]
unsafe_code = "forbid"
missing_docs = "warn"
[lints.clippy]
all = "warn"
pedantic = "allow"#[deny(clippy::unwrap_used)]
fn production_path() { }Quando usar isso: Política de segurança em nível de crate, aprimoramento de avisos como erros ou exceções direcionadas.
Exemplo de Trabalho
#![deny(unsafe_code)]
#![warn(missing_docs)]
mod api {
#![allow(clippy::module_name_repetitions)]
/// Cria um usuário.
pub fn create_user() { }
}# Alternativa ao Cargo.toml para atributos internos
[lints.rust]
unsafe_code = "forbid"O que isso demonstra:
- Atributos de crate se aplicam à unidade de compilação inteira.
- Atributos internos
#![...]em módulos definem o escopo da subárvore. forbidnão pode ser substituído downstream (o mais forte).[lints]no manifesto é preferível para consistência em workspaces.
Análise Detalhada
Níveis
| Nível | Comportamento |
|---|---|
allow | Silencioso |
warn | Aviso, compilação bem-sucedida |
deny | Erro |
forbid | Erro; não pode ser permitido (allow) em filhos |
rustc vs clippy
[lints.rust]
unused_must_use = "deny"
[lints.clippy]
unwrap_used = "deny" # apps: deny; libs: warn- Bibliotecas frequentemente usam
warnparaunwrapna API pública. - Aplicações podem usar
denyparaunwrap_usedem código não relacionado a testes.
Armadilhas
#![deny(warnings)]sem política - Quebra com novos avisos do Rust após uma atualização. Correção: Fixar a toolchain; corrigir avisos prontamente ao atualizar.forbidseguido porallowem submódulo - Erro de compilação. Correção: Usardenyse os filhos precisarem de exceções.- Atributos duplicados e manifesto - Precedência confusa. Correção: Escolher uma única fonte de verdade por lint.
- Permitir
clippy::all- Desabilita verificações valiosas. Correção: Permitir apenas lints específicos. - Código de teste com o mesmo nível de lint -
unwrapem testes é aceitável. Correção:#[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] }.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
CI -D warnings apenas | Não precisa de suporte ao manifesto | Diferenças de política por crate |
cargo clippy -- -W lint | Experimentar localmente | Política permanente |
#[expect(lint)] (nightly) | Suprimir com rastreamento de intenção | Equipes com MSRV estável 1.97 usam allow |
FAQs
deny(warnings) em lib vs bin?
Libs geralmente usam warn; bins/serviços usam deny para rigor de produção.
Como funciona a herança de lint em um workspace?
Cada crate tem seu próprio [lints]; compartilhar via cópia ou padrões futuros de tabela de lint de workspace - documentar em CONTRIBUTING.
missing_docs em itens privados?
Geralmente apenas itens públicos; configurar missing_docs em pub através da documentação do clippy/rustc.
A CI pode substituir o manifesto?
RUSTFLAGS e argumentos do clippy adicionam avisos; o manifesto ainda se aplica como base.
forbid unsafe em um workspace?
Definir em crates de domínio; permitir um único crate ffi com revisões de segurança documentadas.
Como permitir para uma única linha?
#[allow(clippy::lint)] na função ou instrução.
O que quebra em um aumento de edição?
Novos lints do rustc podem gerar avisos; executar cargo fix e clippy após a atualização da toolchain.
deny em build.rs?
Unidade de compilação separada; definir lints nos atributos do crate build.rs, se necessário.
Grupos de lint do Clippy?
clippy::all, clippy::pedantic - habilitar grupos e depois permitir subconjuntos barulhentos.
Documentar a política de lint?
ARCHITECTURE.md ou CONTRIBUTING: expectativas sobre unsafe, unwrap, missing_docs.
Relacionados
- Clippy - lints específicos do clippy
- Lints de Documentação - missing_docs
- Configurando o Clippy - thresholds
- Linting em CI -
-D warnings
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+.