Estouro de Inteiro e Bugs Numéricos
Em builds de debug, o estouro causa pânico em +, -, *. Em release, ocorre o wrapping (envoltório) de complemento de dois, a menos que você use checked_*, saturating_* ou wrapping_* explicitamente.
Receita
let total = a.checked_add(b).ok_or(Error::Overflow)?;
let cents: i64 = amount.parse().context("amount")?;Exemplo de Trabalho
// Matemática influenciada pelo usuário
fn price_total(unit_cents: u32, qty: u32) -> Result<u32, Error> {
unit_cents.checked_mul(qty).ok_or(Error::Overflow)
}
// Anti-padrão de dinheiro com ponto flutuante
// Use centavos inteiros ou rust_decimal para moedaDebug vs. release:
cargo test # pode entrar em pânico no estouro em debug
cargo build --release # envolve silenciosamente em + - *Use o perfil overflow-checks ou operações verificadas explícitas em caminhos de produção.
Mergulho Profundo
Indexação usize: valide o comprimento antes de alocar. A divisão por zero ainda causa pânico em release. Ponto flutuante: comparações de NaN precisam de is_nan.
Armadilhas
- Assumir comportamento de debug em produção - wrapping silencioso. Correção: matemática verificada em entrada do usuário.
- Conversão trunca -
u64 as u32. Correção:try_from. - Ponto flutuante para dinheiro - bugs de arredondamento. Correção: centavos inteiros.
- Conversão de negativo para sem sinal - valores enormes. Correção: valide o sinal antes da conversão.
- Estouro de duração - use
checked_addem durações.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
saturating_add | limita pontuações | totais financeiros precisam de erro |
wrapping_add | hash/criptografia | lógica de negócios |
crate BigInt | ilimitado | inteiros simples em caminhos críticos |
FAQs
forçar pânico de estouro em release?
overflow-checks = true no perfil ou use operações verificadas.
lint do clippy?
arithmetic_side_effects e lints de conversão.
serde grandes números?
Desserializar como string para u64 em JSON quando >2^53.
dtypes do polars?
Int64 explícito para ids; observe a conversão em expressões.
mod aleatório?
Use crates de intervalo não enviesado; evite viés de %.
tempo em milissegundos?
i64 milissegundos; verifique a adição com APIs verificadas do chrono.
estouro simd?
Mesmas regras; intrínsecos de wrapping explícitos se pretendido.
testar estouro?
#[should_panic] apenas em debug; retornos de erro verificados em código de produção.
criptografia?
Use operações de largura fixa; sem wrapping acidental.
auditoria?
grep as e + sem verificação em inteiros de usuário em caminhos críticos.
Relacionado
Versões da Stack: 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+.