Aikido

Perché dovresti controllare il divisore prima di eseguire operazioni di divisione

Leggibilità

Regola
Controlla il divisore prima di eseguire operazioni di divisione.
La divisione per zero provoca errori in fase di esecuzione e
deve essere prevenuta tramite controlli espliciti.

Linguaggi supportati: 45+

Introduzione

La divisione per zero genera errori di runtime immediati nella maggior parte dei linguaggi, mandando in crash le applicazioni senza alcuna gestione elegante del malfunzionamento. L'input degli utenti, i valori calcolati o i risultati del database possono inaspettatamente produrre divisori pari a zero. Una singola operazione di divisione non validata può compromettere i servizi in produzione quando dati al limite attivano l'errore.

Perché è importante

Stabilità del sistema: La divisione per zero può mandare immediatamente in crash l'applicazione in linguaggi come Java, C e Python. In produzione, questo si traduce in richieste perse, transazioni interrotte e indisponibilità del servizio. Anche in JavaScript, dove la divisione per zero restituisce Infinito oppure NaN, questi valori si propagano attraverso i calcoli generando risultati errati.

Integrità dei dati: quando si verificano errori di divisione durante l'elaborazione batch o le pipeline di dati, è possibile che vengano scritti risultati parziali prima del crash. Questo lascia i dati in uno stato incoerente, richiedendo un ripristino manuale e potenzialmente corrompendo i sistemi a valle che dipendono da dati completi.

Superficie di attacco: gli hacker possono creare intenzionalmente input che producono divisori pari a zero per bloccare i servizi. Gli endpoint API che eseguono calcoli senza validare i divisori diventano vettori di attacco per la denial-of-service. Una singola richiesta malevola 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é è errato: Entrambe le funzioni vanno in crash quando il divisore è zero. calculateAverageOrderValue() fallisce quando orderCount è 0, e calculateConversionRate() fallisce quando visitors è 0. Questi scenari sono realistici: le nuove aziende hanno zero ordini, le campagne possono avere zero visitatori.

✅ 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 prevengono errori di crash dovuti alla divisione per zero. Le funzioni restituiscono valori predefiniti sensati (zero) quando la divisione non è possibile. L'applicazione continua a funzionare anche con input limite, mantenendo stabilità e disponibilità.

Conclusione

Valida sempre i divisori prima delle operazioni di divisione. Restituisci valori predefiniti appropriati, genera errori descrittivi o gestisci il caso dello zero in base alla logica di business. Non dare mai per scontato che i divisori siano diversi da zero, soprattutto in presenza di input utente o dati esterni.

FAQ

Hai domande?

Dovrei verificare la presenza di zero negativo o casi limite in virgola mobile?

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

Che dire dei linguaggi che restituiscono Infinity anziché andare in crash?

JavaScript restituisce Infinity in caso di divisione per zero, non un errore. Tuttavia, Infinity si propaga attraverso i calcoli, producendo risultati inattesi. Verifica esplicitamente la presenza di divisori pari a zero e gestiscili in modo appropriato anziché affidarti al comportamento di Infinity.

Come gestisco la divisione nelle query dei database?

Il comportamento dei database varia: PostgreSQL genera un errore in caso di divisione per zero, mentre MySQL restituisce NULL per impostazione predefinita. Usa NULLIF per garantire la sicurezza tra diversi database: SELECT total / NULLIF(count, 0) restituisce NULL anziché un errore. Oppure utilizza 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.