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 detectan casos obvios como código después de sentencias `return` o `throw`. Para casos complejos, utiliza herramientas de cobertura de código durante las pruebas. El código que muestra una cobertura cero en suites de prueba exhaustivas es probablemente inalcanzable, aunque debes verificarlo manualmente, ya que podría estar simplemente sin probar.

¿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. El bloque 'finally' siempre se ejecuta incluso después de un 'return'. Un error común es colocar el código de limpieza 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?

El código inalcanzable ES el error. Significa que la lógica crítica que debería ejecutarse no lo hace. Si tu código inalcanzable contiene validación, comprobaciones de seguridad o manejo de errores, tu función está rota aunque no lance excepciones. El error es que la funcionalidad prevista nunca se ejecuta, no que el código inalcanzable falle.

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

El código detrás de las 'feature flags' deshabilitadas sigue siendo alcanzable en tiempo de ejecución, incluso si está deshabilitado en su entorno. 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 elimine la característica por completo.

¿Debería eliminar funciones e imports no utilizados?

Sí, pero ese es un problema diferente. El código inalcanzable es estructuralmente imposible de ejecutar dentro de su función debido al flujo de control. Las funciones no utilizadas son invocables pero nunca se llaman. Ambos desperdician recursos, pero requieren diferentes estrategias de detección. La detección de código inalcanzable funciona a nivel de función, mientras que la detección de código no utilizado requiere un análisis de programa completo.

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.