Aikido

Cómo identificar y eliminar código muerto inalcanzable

Legibilidad

Regla
Eliminar código muerto inalcanzable
El código inalcanzable es confuso,
imposible de probar y debe ser eliminado.

Lenguajes compatibles: 45+

Introducción

El código inalcanzable indica una lógica rota en tu base de código. Código después de volver o lanzar declaraciones fue escrita para ejecutarse pero nunca se ejecuta. Las condiciones que son siempre falsas ocultan validaciones o manejos de errores que nunca se activan. Las ramas a las que la lógica nunca llega debido al flujo de control contienen funcionalidades que no pueden ejecutarse. Cuando encuentras código inalcanzable, has encontrado un error en el que tu código no está haciendo lo que se pretendía.

Por qué es importante

Vulnerabilidades de seguridad: Las comprobaciones de seguridad inalcanzables no protegen tu aplicación. Si la autenticación, la autorización o la validación de entrada aparecen después de un volver declaración, tu código parece seguro pero no lo es. Los atacantes pueden explotar funciones que parecen tener medidas de seguridad pero que en realidad las eluden. La revisión de código podría pasar por alto estas vulnerabilidades porque la lógica de seguridad existe en la base de código, pero nunca se ejecuta.

Errores lógicos en producción: El código muerto significa que tu función no está implementando la lógica que crees. La validación que nunca se ejecuta permite el paso de datos no válidos. El manejo de errores inalcanzable significa que los errores se propagan sin ser capturados. Las reglas de negocio que se omiten producen resultados incorrectos. El código parece correcto pero se comporta de manera diferente a lo previsto.Lagunas en las pruebas: El código inalcanzable no se puede probar. Si tu suite de pruebas pasa a pesar de que el código crítico es inalcanzable, significa que no tienes pruebas que cubran esas rutas. El código inalcanzable revela lagunas en tu cobertura de pruebas donde existe lógica importante pero no hay pruebas que verifiquen su ejecución.

Impacto en el tamaño del bundle: El código inalcanzable aún se envía a los usuarios como peso muerto en tu bundle de JavaScript. Los usuarios descargan y parsean código que nunca se ejecuta, pero esto es secundario a los errores lógicos que indica el código muerto.

Ejemplos de código

❌ No conforme:

function transferFunds(fromAccount, toAccount, amount) {
    if (!fromAccount || !toAccount) {
        return { success: false, error: 'Invalid accounts' };
    }

    if (amount <= 0) {
        return { success: false, error: 'Invalid amount' };
        logSuspiciousActivity(fromAccount, amount);
    }

    const balance = getBalance(fromAccount);
    if (balance >= amount) {
        deductFunds(fromAccount, amount);
        addFunds(toAccount, amount);
        return { success: true };
    }

    return { success: false, error: 'Insufficient funds' };

    // Check for fraud patterns
    if (isHighRiskTransaction(fromAccount, toAccount, amount)) {
        notifyFraudTeam(fromAccount, toAccount, amount);
        return { success: false, error: 'Transaction blocked' };
    }
}

Por qué está mal: La lógica de detección de fraude nunca se ejecuta porque la función retorna antes de alcanzarla. El registro de actividad sospechosa después de la comprobación del importe tampoco se ejecuta nunca. Esta función parece tener medidas de seguridad, pero en realidad procesa todas las transferencias sin comprobaciones de fraude.

✅ Conforme:

function transferFunds(fromAccount, toAccount, amount) {
    if (!fromAccount || !toAccount) {
        return { success: false, error: 'Invalid accounts' };
    }

    if (amount <= 0) {
        logSuspiciousActivity(fromAccount, amount);
        return { success: false, error: 'Invalid amount' };
    }

    if (isHighRiskTransaction(fromAccount, toAccount, amount)) {
        notifyFraudTeam(fromAccount, toAccount, amount);
        return { success: false, error: 'Transaction blocked' };
    }

    const balance = getBalance(fromAccount);
    if (balance >= amount) {
        deductFunds(fromAccount, amount);
        addFunds(toAccount, amount);
        return { success: true };
    }

    return { success: false, error: 'Insufficient funds' };
}

Por qué esto es importante: Todas las comprobaciones de seguridad se ejecutan antes de procesar la transferencia. La detección de fraude se ejecuta en cada transacción. La actividad sospechosa se registra. La función implementa la lógica de seguridad que parece tener.

Conclusión

El código inalcanzable indica errores en tu lógica donde la funcionalidad prevista nunca se ejecuta. Encuéntralo con herramientas de análisis estático en tu pipeline de CI y trátalo como un problema crítico, no solo como una limpieza de código. Cuando descubras código inalcanzable, investiga por qué existe y qué lógica se suponía que debía ejecutarse pero no lo hace.

Preguntas frecuentes

¿Tiene preguntas?

¿Cómo identifico código inalcanzable en bases de código grandes?

Las herramientas de análisis estático pueden detectar casos obvios como código después de sentencias `return` o `throw`. Para casos más complejos, utiliza herramientas de cobertura de código durante las pruebas. El código que muestra una cobertura cero en todas las ejecuciones de prueba podría ser inalcanzable. Revisa cada caso manualmente, ya que parte del código podría ser alcanzable pero simplemente no probado.

¿Qué pasa con el código después de retornos anticipados en bloques try-catch?

El código después de un 'return' en un bloque 'try' pero antes de un 'finally' es inalcanzable. Sin embargo, los bloques 'finally' siempre se ejecutan incluso después de un 'return'. Error común: colocar una limpieza importante después de un 'return' en un bloque 'try' en lugar de en 'finally' donde realmente se ejecutaría.

¿Puede el código inalcanzable causar errores en tiempo de ejecución?

No, porque nunca se ejecuta. Sin embargo, puede hacer referencia a variables no definidas o llamar a funciones inexistentes sin causar errores, lo que lo hace aún más insidioso. Este código defectuoso pasa todas las pruebas porque nunca se ejecuta, pero engaña a cualquiera que lea la base de código.

¿Qué pasa con los feature flags y la compilación condicional?

El código detrás de las 'feature flags' deshabilitadas es alcanzable en tiempo de ejecución, incluso si está deshabilitado en su entorno actual. El código verdaderamente inalcanzable es estructuralmente imposible de ejecutar debido al flujo de control. El código con 'feature flags' es condicionalmente alcanzable y debería permanecer hasta que la característica se elimine por completo.

¿Debería eliminar funciones e imports no utilizados?

Sí, pero esa es una categoría diferente de código muerto. El código inalcanzable es estructuralmente imposible de ejecutar debido al flujo de control. Las funciones no utilizadas son alcanzables pero nunca se llaman. Ambos deben eliminarse, pero requieren diferentes estrategias de detección. La detección de código no utilizado requiere un análisis de programa completo, mientras que la detección de código inalcanzable funciona a nivel de función.

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.