Aikido

Perché è importante verificare il divisore prima di eseguire operazioni di divisione

Leggibilità

Regola
Verifica divisore prima di le operazioni .
La per zero provoca errori arresti anomali e
deve essere preveniti con controlli controlli.

Lingue supportate: 45+

Introduzione

Nella maggior parte dei linguaggi di programmazione, la divisione per zero provoca errori immediati in fase di esecuzione, causando il crash delle applicazioni senza una degradazione graduale. Gli input dell'utente, i valori calcolati o i risultati provenienti dal database possono tutti generare divisori pari a zero in modo imprevisto. Una singola operazione di divisione non verificata può causare l'interruzione dei servizi di produzione quando dati relativi a casi limite innescano l'errore.

Perché è importante

Stabilità del sistema: La divisione per zero può causare il crash immediato dell'applicazione in linguaggi come Java, C e Python. In ambiente di produzione, ciò comporta la perdita di richieste, l'interruzione delle transazioni e l'indisponibilità del servizio. Anche in JavaScript, dove la divisione per zero restituisce Infinito oppure NaN, questi valori si ripercuotono sui calcoli causando risultati errati.

Integrità dei dati: quando si verificano errori di divisione durante l'elaborazione in batch o nelle pipeline di dati, è possibile che alcuni risultati vengano scritti prima del crash. Ciò comporta la presenza di dati in stati incoerenti, che richiedono un ripristino manuale e potrebbero danneggiare i sistemi a valle che dipendono dalla completezza dei dati.

Superficie di attacco: gli aggressori possono creare intenzionalmente input che generano divisori pari a zero per causare il crash dei servizi. Gli endpoint API che eseguono calcoli senza verificare la validità dei divisori diventano vettori di attacco denial-of-service. Una singola richiesta dannosa può mettere fuori uso l'intero servizio.

Esempi di codice

❌ Non conforme:

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

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

Perché è sbagliato: Entrambe le funzioni vanno in errore quando il divisore è zero. calcolaValoreMedioOrdine() non funziona quando numeroOrdini è 0, e calculateConversionRate() non funziona quando visitatori è 0. Questi scenari sono realistici: le nuove aziende possono non avere alcun ordine, le campagne possono non avere alcun visitatore.

✅ Conforme:

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;
}

Perché è importante: i controlli espliciti impediscono il crash dovuto alla divisione per zero. Le funzioni restituiscono valori predefiniti appropriati (zero) quando la divisione non è possibile. L'applicazione continua a funzionare anche in presenza di input limite, garantendo stabilità e disponibilità.

Conclusione

Verificare sempre i divisori prima di eseguire operazioni di divisione. Restituire valori predefiniti appropriati, generare errori descrittivi o gestire il caso dello zero in base alla logica di business. Non dare mai per scontato che i divisori siano diversi da zero, specialmente quando si tratta di input dell'utente o dati esterni.

Domande frequenti

Hai delle domande?

Devo verificare la presenza di casi limite relativi allo zero negativo o ai numeri in virgola mobile?

In JavaScript, -0 === 0 è vero, quindi un unico controllo è sufficiente per entrambi i casi. Poiché JavaScript restituisce Infinity o NaN invece di andare in crash, è opportuno verificare anche la presenza di questi valori nel risultato se l'applicazione richiede calcoli numerici precisi: if (!isFinite(result)). Alcuni ambiti richiedono il controllo dell'ordine di grandezza del divisore (numeri molto piccoli vicini allo zero) per evitare perdite di precisione nell'aritmetica in virgola mobile.

E che dire dei linguaggi che restituiscono "Infinity" invece di andare in crash?

JavaScript restituisce "Infinity" in caso di divisione per zero, anziché generare un errore. Tuttavia, "Infinity" si propaga nei calcoli, producendo risultati inaspettati. È consigliabile verificare esplicitamente la presenza di divisori pari a zero e gestirli in modo appropriato, anziché fare affidamento sul comportamento di "Infinity".

Come si gestisce la divisione nelle query del database?

Il comportamento dei database varia: PostgreSQL genera un errore in caso di divisione per zero, mentre MySQL restituisce NULL per impostazione predefinita. Per garantire la sicurezza su tutti i database, utilizzare NULLIF: SELECT total / NULLIF(count, 0) restituisce NULL anziché un errore. In alternativa, è possibile utilizzare istruzioni CASE esplicite: CASE WHEN count = 0 THEN 0 ELSE total / count END. I controlli a livello di database prevengono i problemi indipendentemente dal comportamento specifico del database.

Metti in sicurezza ora

Metti in sicurezza il tuo codice, il cloud e il runtime in un unico sistema centralizzato.
Trova e risolvi le vulnerabilità rapidamente e automaticamente.

Nessuna carta di credito richiesta | Risultati della scansione in 32 secondi.