Clippy
Clippy é o linter do Rust para correção, performance e código idiomático. Execute-o em todo PR com -D warnings para tratar lints como erros.
Receita
cargo clippy --workspace --all-targets -- -D warnings[lints.clippy]
enum_glob_use = "deny"Quando usar: Sempre em CI; localmente antes de enviar alterações em Rust.
Exemplo de Trabalho
# Local
cargo clippy --all-targets -- -W clippy::pedantic
# CI (estrito)
cargo clippy --workspace --all-targets --all-features -- -D warnings// clippy detecta:
let v = vec![1, 2, 3];
let x = v.iter().cloned().collect::<Vec<_>>(); // use .copied() para tipos CopyO que isso demonstra:
--all-targetsinclui testes e benchmarks-D warningspromove avisos para erros[lints.clippy]no Manifest define níveis padrão (Rust 1.74+)- Lints pedantes são opcionais para equipes mais rigorosas
Mergulho Profundo
Categorias de Lint
| Grupo | Exemplos |
|---|---|
| correção | quase certamente bugs |
| suspeito | prováveis erros |
| estilo | Rust idiomático |
| perf | alocação/clonagem desnecessária |
| pedante | barulhento, mas educativo |
Permitindo Exceções
#[allow(clippy::too_many_arguments)]
fn legacy_api(...) { }
// preferir com razão:
#[allow(clippy::cast_possible_truncation)] // protocolo define formato de wire u8- Nível de arquivo:
#![allow(...)]na raiz do crate com moderação - Prefira corrigir em vez de
allowem massa
Armadilhas
- Clippy sem testes - questões apenas de teste perdidas. Correção:
--all-targets. - Avisos de código morto com feature-gating - falsos positivos específicos de cfg. Correção: job
cargo clippy --all-features. allowgenéricos - esconde bugs reais. Correção:allowpor linha com comentário.- Clippy antigo em Rust novo - sugestões desatualizadas. Correção: corresponder ao toolchain de CI 1.97.0.
- Ignorando lints de perf - morte por mil clones. Correção: trate
clippy::redundant_cloneseriamente em caminhos críticos.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Lints rustc apenas | Configuração mínima | Falta de verificações clippy de alto valor |
cargo-deny | Licenças/avisos | Substituindo estilo/correção clippy |
| Revisão manual | Nunca sozinho | Complemento ao clippy |
FAQs
clippy vs lints rustc?
Clippy são passes adicionais; ambos rodam via cargo clippy.
Como corrigir ruído do cargo clippy em dependências?
Você não pode corrigir o código de dependências; -A clippy::lint_name na raiz do crate apenas para expansões de macro de terceiros não corrigíveis.
Pedantic deve ser o padrão?
Geralmente não para bases de código grandes; habilite para novos crates ou como um reforço incremental.
clippy no MSRV?
Execute clippy no toolchain MSRV na matriz de CI para detectar APIs não suportadas.
Como corrigir automaticamente?
Alguns lints suportam cargo clippy --fix --allow-dirty - revise o diff cuidadosamente.
Clippy em workspace?
Um único comando na raiz com --workspace compartilha o cache do diretório target/.
clippy em build.rs?
--all-targets inclui scripts de build; corrija ou permita explicitamente.
Lint de muitos argumentos?
Refatore para uma struct builder ou struct de configuração; permita apenas para bindings gerados/FFI.
Clippy atrasa a CI?
O cache target/ ajuda; execute após o fmt; paralelize com testes se os runners permitirem.
Manifest [lints] vs atributos?
Prefira [lints.clippy] em Cargo.toml para política em todo o crate; permita linhas para exceções.
Relacionados
- rustfmt - formatação
- Configurando Clippy - clippy.toml
- Níveis e Atributos de Lint - allow/deny
- Linting em CI - aplicação
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+.