Aikido

Por que você deve verificar o divisor antes de realizar operações de divisão

Legibilidade

Regra
Verificar divisor antes de operações de divisão .
Divisão por zero causa falhas e e
deve ser evitadas com verificações .

Idiomas suportados: 45+

Introdução

A divisão por zero causa erros de tempo de execução imediatos na maioria das linguagens, travando aplicativos sem degradação elegante. Entradas de usuário, valores calculados ou resultados de banco de dados podem produzir divisores zero inesperadamente. Uma única operação de divisão não verificada pode derrubar serviços em produção quando dados de caso de borda acionam o erro.

Por que isso importa

Estabilidade do sistema: A divisão por zero pode travar o aplicativo imediatamente em linguagens como Java, C e Python. Em produção, isso significa requisições perdidas, transações interrompidas e indisponibilidade do serviço. Mesmo em JavaScript, onde a divisão por zero retorna Infinito ou NaN, esses valores se propagam através de cálculos, causando resultados incorretos.

Integridade dos dados: Quando erros de divisão ocorrem durante o processamento em lote ou pipelines de dados, resultados parciais podem ser gravados antes da falha. Isso deixa os dados em estados inconsistentes, exigindo recuperação manual e potencialmente corrompendo sistemas a jusante que dependem de dados completos.

Superfície de ataque: Atacantes podem intencionalmente criar entradas que produzem divisores zero para derrubar serviços. Endpoints de API que realizam cálculos sem validar divisores tornam-se vetores de negação de serviço. Uma única requisição maliciosa pode derrubar todo o serviço.

Exemplos de código

❌ Não-conforme:

function calculateAverageOrderValue(totalRevenue, orderCount) {
    return totalRevenue / orderCount;
}

function calculateConversionRate(conversions, visitors) {
    return (conversions / visitors) * 100;
}

Por que está errado: Ambas as funções falham quando o divisor é zero. calculateAverageOrderValue() falha quando orderCount é 0, e calculateConversionRate() falha quando visitantes é 0. Esses cenários são realistas: novos negócios têm zero pedidos, campanhas podem ter zero visitantes.

✅ Compatível:

function calculateAverageOrderValue(totalRevenue, orderCount) {
    if (orderCount === 0) {
        return 0;
    }
    return totalRevenue / orderCount;
}

function calculateConversionRate(conversions, visitors) {
    if (visitors === 0) {
        return 0;
    }
    return (conversions / visitors) * 100;
}

Por que isso importa: Verificações explícitas evitam falhas por divisão por zero. As funções retornam valores padrão sensatos (zero) quando a divisão não é possível. A aplicação continua funcionando mesmo com entradas de caso de borda, mantendo a estabilidade e a disponibilidade.

Conclusão

Sempre valide os divisores antes das operações de divisão. Retorne valores padrão apropriados, lance erros descritivos ou trate o caso de zero com base na lógica de negócios. Nunca presuma que os divisores serão diferentes de zero, especialmente com entrada do usuário ou dados externos.

FAQs

Dúvidas?

Devo verificar por zero negativo ou casos de borda de ponto flutuante?

Em JavaScript, -0 === 0 é verdadeiro, então uma única verificação lida com ambos. Como o JavaScript retorna Infinity ou NaN em vez de falhar, você também deve verificar por esses valores no resultado se sua aplicação requer cálculos numéricos precisos: if (!isFinite(result)). Alguns domínios exigem a verificação da magnitude do divisor (números muito pequenos próximos de zero) para evitar perda de precisão na aritmética de ponto flutuante.

E quanto às linguagens que retornam Infinity em vez de falhar?

JavaScript retorna Infinity para divisão por zero, não um erro. No entanto, Infinity se propaga através dos cálculos, produzindo resultados inesperados. Verifique explicitamente por divisores zero e lide com eles de forma apropriada, em vez de depender do comportamento de Infinity.

Como lidar com divisão em consultas de banco de dados?

O comportamento do banco de dados varia: PostgreSQL gera erros em divisão por zero, enquanto MySQL retorna NULL por padrão. Use NULLIF para segurança entre bancos de dados: SELECT total \/ NULLIF(count, 0) retorna NULL em vez de erro. Ou use instruções CASE explícitas: CASE WHEN count = 0 THEN 0 ELSE total \/ count END. Verificações em nível de banco de dados previnem problemas independentemente do comportamento específico do banco de dados.

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.