Código muerto en Rust: cuando el compilador es su estricto profesor
\n\nTodo desarrollador de Rust, tarde o temprano, se enfrenta a este momento: escribe código, todo es lógico, pero el compilador de repente muestra decenas de advertencias amarillas warning: dead code. Es como si un profesor revisara su tarea y subrayara cada variable no utilizada. Por un lado, es útil; por el otro, a veces molesta.
Imagine: está trabajando en un proyecto grande, donde algunas funciones están reservadas para funcionalidades futuras, o está experimentando con una nueva API. En Rust, las advertencias de código muerto ¿se activan por defecto a nivel de #![deny(dead_code)]? No, pero el compilador es muy insistente. La pregunta que atormenta a miles de desarrolladores en Stack Overflow: ¿cómo desactivar estas advertencias a nivel de todo el crate?
En este artículo, analizaremos las mejores prácticas de 2025: desde la desactivación simple hasta la configuración detallada con atributos, macros y herramientas como Clippy. ¡Allá vamos!
\n\n¿Por qué Rust es tan estricto con el código muerto?
\n\nRust fue creado como un lenguaje para programación de sistemas, donde el rendimiento y la seguridad son importantes. El código muerto no es solo un defecto estilístico. Son errores potenciales, dependencias innecesarias y un aumento en el tiempo de compilación. El compilador activa por defecto el lint dead_code para que no olvide eliminar fragmentos innecesarios.
Pero en la vida real, sucede lo siguiente:
\n- \n
- Escribe una biblioteca y algunas funciones públicas aún no se utilizan en los ejemplos. \n
- Desarrolla un prototipo y no quiere distraerse con advertencias. \n
- Tiene configuraciones para diferentes plataformas (
cfg), y el código para otras arquitecturas simplemente está como peso muerto. \n
Ignorar las advertencias de código muerto es posible, pero es mejor controlar el proceso. Veamos cómo se hace correctamente.
\n\nMétodo estándar: el atributo #[allow(dead_code)]
\n\nEl método más simple y popular es agregar el atributo a nivel de crate. Para ello, al principio del archivo lib.rs o main.rs escribimos:
// lib.rs\n#![allow(dead_code)]\n\npub fn unused_function() {\n println!("¡No soy llamado en ninguna parte, pero el compilador calla!");\n}\n\nfn main() {\n println!("Hello, world!");\n}\n\nEl atributo #![allow(dead_code)] (note el signo de exclamación — es un atributo interno, aplicado al módulo actual) desactiva las advertencias para todo el crate. Pero, ¿es adecuado para producción? No siempre.
Desventajas:
\n- \n
- Desactiva la verificación para todo el crate, incluyendo código que escribió accidentalmente y olvidó eliminar. \n
- En proyectos grandes, esto enmascara problemas reales. \n
Ventajas:
\n- \n
- Solución rápida para prototipos. \n
- Adecuado para proyectos de aprendizaje. \n
Desactivación puntual: atributos en funciones
\n\nLa mejor práctica no es desactivar todo globalmente, sino marcar secciones específicas. Rust permite colocar #[allow(dead_code)] directamente sobre una función, estructura o módulo:
#[allow(dead_code)]\nfn helper_function() {\n // Esta función aún no se usa, pero la conservamos para una futura refactorización\n}\n\nstruct MyStruct {\n #[allow(dead_code)]\n field1: u32, // El campo no se usa, pero podría ser necesario\n field2: u32,\n}\n\nEste enfoque se considera una buena práctica en 2025: le dice explícitamente al compilador y a otros desarrolladores: «Sé que este código está muerto, pero lo necesito». Transparencia y control: eso es lo que se valora en la comunidad de Rust.
\n\nAtributos a nivel de módulo
\n\nSi tiene un módulo completo con código experimental, puede desactivar las advertencias para él sin tocar el resto del crate:
\n\n