HeadlinesBriefing HeadlinesBriefing.com

Evasión de lifetimes en Rust por asignación covariante

Hacker News •
×

Un informe de Hacker News describe un error de solidez en Rust en el que los requisitos de tiempo de vida de una struct pueden eludirse mediante la asignación covariante de campos. El autor comparte un programa pequeño que usa un tipo envoltorio, Q<T>, que contiene un Option<T> con una implementación de Drop. La implementación de Drop mueve el valor contenido a un Mutex<Vec<Box<dyn Any + Send>>> estático, lo cual debería ser imposible para un valor prestado que no vive durante 'static.

En el ejemplo, un String local se asigna por referencia al envoltorio dentro de un ámbito interno, por lo que el préstamo debería terminar cuando se cierra ese ámbito. Como el campo del envoltorio es covariante, el compilador acepta la asignación, y la referencia puede entonces almacenarse más allá del tiempo de vida de la variable local. El programa compila e imprime contenido de memoria no relacionado en lugar de ser rechazado.

Al ejecutarlo bajo AddressSanitizer, el programa falla con un error stack-use-after-scope, lo que confirma que la referencia colgante se desreferencia efectivamente. Según el informe, el problema es reproducible en las compilaciones nightly actuales y en las versiones estables desde al menos la 1.85.0. La publicación incluye enlaces a ejemplos de Compiler Explorer con y sin sanitizadores.

El hallazgo apunta a un agujero de solidez en la forma en que la varianza interactúa con el almacenamiento basado en Drop, y es el tipo de problema que los mantenedores de Rust tratan como de alta prioridad, porque el código seguro nunca debería producir comportamiento indefinido.

Preguntas frecuentes: ¿Por qué este programa de Rust compila a pesar de la referencia colgante?

La covarianza del campo permite que el compilador acepte la asignación de una referencia de vida más corta, y la implementación de Drop almacena luego esa referencia en un contenedor 'static, extendiendo su uso más allá del tiempo de vida de la variable local. Se trata de un error de solidez; el compilador debería rechazar el código.

Fuente: Hacker News · Resumido por HeadlinesBriefing