Aikido

Perché evitare l'uso di "goto" nel codice per motivi di manutenibilità e sicurezza

Leggibilità

Regola
Da evitare l'uso di goto.
Il istruzione crea crea un controllo di controllo 
non strutturato che fa sì che il codice difficile da seguire e da mantenere.

Lingue supportate: 45+

Introduzione

vai a passa direttamente a punti arbitrari del codice, interrompendo il flusso naturale dell'esecuzione. Ciò rende molto difficile l'analisi dello stato, la gestione degli errori e la valutazione delle prestazioni. La manutenzione del codice che utilizza il `goto` aumenta il rischio di bug difficili da individuare e di comportamenti indesiderati. Le alternative strutturate producono codice prevedibile, leggibile e facile da mantenere.

Perché è importante

Implicazioni per la sicurezza: i salti non strutturati possono aggirare i controlli di convalida o autorizzazione, esponendo potenzialmente operazioni sensibili.

Impatto sulle prestazioni: le catene complesse di istruzioni `goto` rendono più difficili la profilatura e l'ottimizzazione, aumentando il rischio di percorsi di esecuzione inefficienti.

Manutenibilità del codice: l'istruzione `goto` crea un flusso di controllo intricato, simile a uno "spaghetti", difficile da rifattorizzare o estendere in modo sicuro.

Superficie di attacco: i salti impropri possono esporre involontariamente percorsi di codice non sicuri o tralasciare sezioni critiche per la sicurezza.

Esempi di codice

❌ Non conforme:

<?php
for ($i = 0; $i < 10; $i++) {
    if ($i == 3) {
        goto end;
    }
    echo "$i\n";
}

end:
echo "Jumped out!";
?>

Perché è sbagliato: le istruzioni `goto` creano cicli non strutturati, rendendo difficile comprendere il flusso di esecuzione o inserire logica aggiuntiva in modo sicuro.

✅ Conforme:

<?php
for ($i = 0; $i < 10; $i++) {
    if ($i == 3) {
        break;
    }
    echo "$i\n";
}

echo "Jumped out!";
?>

Perché è importante: l'uso di un ciclo "for" rende il flusso di controllo esplicito, prevedibile e gestibile, pur mantenendo lo stesso comportamento.

❌ Non conforme:

function process(items) {
    for (const item of items) {
        if (!item) {
            console.error('Invalid item detected');
            return false;
        }
    }
    return true;
}

Perché è sbagliato: i salti con `goto` rendono poco chiari il percorso di errore e l'esecuzione normale, rendendo difficile seguirli o estenderli.

✅ Conforme:

function process(items) {
    for (const item of items) {
        if (!item) {
            console.error('Invalid item detected');
            return false;
        }
    }
    return true;
}

Perché è importante: i cicli strutturati e i ritorni anticipati rendono la logica chiara, la gestione degli errori esplicita e la manutenzione più semplice.

Conclusione

Evita l'uso di `goto` per mantenere un codice strutturato, leggibile e sicuro. Utilizza cicli, funzioni e ritorni anticipati per garantire un flusso di controllo prevedibile. Ciò riduce i costi di manutenzione, previene bug difficili da individuare e garantisce percorsi di esecuzione sicuri.

Domande frequenti

Hai delle domande?

L'uso di "goto" è mai accettabile nel codice moderno?

Raramente. Solo nei linguaggi di basso livello, per operazioni simili all’assembly in cui le prestazioni sono fondamentali. Il codice di alto livello dovrebbe utilizzare un flusso di controllo strutturato.

Come posso sostituire il comando "goto" nei cicli complessi?

Utilizza le istruzioni `break`, `continue`, i ritorni anticipati o le funzioni di supporto per strutturare il flusso senza salti arbitrari.

Evitare l'uso di "goto" può migliorare la sicurezza?

Sì. Il flusso di controllo esplicito garantisce che i controlli di validità e di sicurezza non vengano aggirati accidentalmente.

Evitare l'uso di `goto` influisce sulle prestazioni?

No. I cicli strutturati e le funzioni sono efficienti e più facili da ottimizzare rispetto ai salti arbitrari.

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.