Aikido

¿Por qué evitar el uso de 'goto' en el código para la mantenibilidad y la seguridad?

Legibilidad

Regla
Evitar el uso de goto.
La sentencia goto crea un flujo de control 
no estructurado que dificulta el seguimiento y mantenimiento del código.

Lenguajes compatibles: 45+

Introducción

goto salta directamente a puntos arbitrarios en el código, rompiendo el flujo natural de ejecución. Esto dificulta enormemente el razonamiento sobre el estado, el manejo de errores y el rendimiento. Mantener código con goto aumenta el riesgo de errores sutiles y comportamientos inesperados. Las alternativas estructuradas producen código predecible, legible y mantenible.

Por qué es importante

Implicaciones de seguridad: Los saltos no estructurados pueden eludir las comprobaciones de validación o autorización, exponiendo potencialmente operaciones sensibles.

Impacto en el rendimiento: Las cadenas 'goto' complejas dificultan la elaboración de perfiles y la optimización, aumentando el riesgo de rutas de ejecución ineficientes.

Mantenibilidad del código: El `goto` crea un flujo de control tipo espagueti que es difícil de refactorizar o extender de forma segura.

Superficie de ataque: Los saltos incorrectos pueden exponer involuntariamente rutas de código inseguras o saltarse secciones críticas para la seguridad.

Ejemplos de código

❌ No conforme:

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

end:
echo "Jumped out!";
?>

Por qué está mal: Las sentencias goto crean bucles no estructurados, lo que dificulta razonar sobre el flujo o insertar lógica adicional de forma segura.

✅ Conforme:

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

echo "Jumped out!";
?>

Por qué es importante: El uso de un bucle `for` hace que el flujo de control sea explícito, predecible y mantenible, a la vez que conserva un comportamiento idéntico.

❌ No conforme:

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

Por qué es incorrecto: los saltos `goto` oscurecen la ruta de error y la ejecución normal, dificultando su seguimiento o extensión.

✅ Conforme:

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

¿Por qué esto importa? Los bucles estructurados y las salidas anticipadas clarifican la lógica, hacen explícita la gestión de errores y facilitan el mantenimiento.

Conclusión

Evitar el uso de goto para mantener un código estructurado, legible y seguro. Utilizar bucles, funciones y retornos anticipados para un flujo de control predecible. Esto reduce los costes de mantenimiento, previene errores sutiles y asegura rutas de ejecución seguras.

Preguntas frecuentes

¿Tiene preguntas?

¿Es el 'goto' alguna vez aceptable en código moderno?

Raramente. Solo en lenguajes de bajo nivel para operaciones críticas de rendimiento similares al ensamblador. El código de alto nivel debería usar un flujo de control estructurado.

¿Cómo reemplazo goto en bucles complejos?

Utiliza `break`, `continue`, retornos anticipados o funciones auxiliares para estructurar el flujo sin saltos arbitrarios.

¿Puede evitar el uso de 'goto' mejorar la seguridad?

Sí. El flujo de control explícito garantiza que las validaciones y las comprobaciones de seguridad no se omitan accidentalmente.

¿Evitar `goto` afecta al rendimiento?

No. Los bucles y funciones estructurados son eficientes y más fáciles de optimizar que los saltos arbitrarios.

Asegúrate ahora.

Proteja su código, la nube y el entorno de ejecución en un único sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.