HeadlinesBriefing HeadlinesBriefing.com

Contournement des lifetimes Rust par covariance

Hacker News •
×

Un rapport publié sur Hacker News décrit une faille de solidité (soundness) dans Rust, qui permet de contourner les exigences de durée de vie d'une struct grâce à l'affectation covariante d'un champ. L'auteur partage un petit programme utilisant un type enveloppe, Q<T>, qui contient un Option<T> ainsi qu'une implémentation de Drop. Cette implémentation déplace la valeur contenue dans un Mutex<Vec<Box<dyn Any + Send>>> statique, ce qui devrait être impossible pour une valeur empruntée qui ne vit pas pendant 'static.

Dans l'exemple, une String locale est affectée par référence à l'enveloppe à l'intérieur d'un bloc interne, si bien que l'emprunt devrait prendre fin à la fermeture de ce bloc. Comme le champ de l'enveloppe est covariant, le compilateur accepte l'affectation, et la référence peut alors être stockée au-delà de la durée de vie de la variable locale. Le programme compile et affiche le contenu de mémoires sans rapport au lieu d'être rejeté.

Lorsqu'il est exécuté avec AddressSanitizer, le programme plante avec une erreur stack-use-after-scope, ce qui confirme que la référence pendante est bien déréférencée. Selon le rapport, le problème est reproductible sur les versions nightly actuelles ainsi que sur les versions stables jusqu'à au moins la 1.85.0. Le message fournit des liens vers des exemples Compiler Explorer avec et sans sanitizers.

Cette découverte met en évidence une faille de solidité dans la manière dont la variance interagit avec le stockage fondé sur Drop. Ce type de problème est traité comme prioritaire par les mainteneurs de Rust, car le code sûr ne devrait jamais produire de comportement indéfini.

FAQ : Pourquoi ce programme Rust compile-t-il malgré la référence pendante ?

La covariance du champ permet au compilateur d'accepter l'affectation d'une référence de durée de vie plus courte, puis l'implémentation de Drop stocke cette référence dans un conteneur 'static, prolongeant son utilisation au-delà de la durée de vie de la variable locale. Il s'agit d'une faille de solidité : le compilateur aurait dû rejeter ce code.

Source: Hacker News · Résumé par HeadlinesBriefing