Contexte du problème

Le borrow checker de Rust garantit que chaque référence possède une durée de vie compatible avec son usage, évitant ainsi les accès mémoire invalides. L'issue #164250, ouvert sur le dépôt officiel, signale que cette garantie peut être contournée lorsqu'un champ d'une structure est assigné de façon covariante. Le rapport précise que le défaut remonte à 11 ans, c'est‑à‑dire depuis les premières versions du compilateur.

Mécanisme de contournement

Dans Rust, les champs d'une structure sont généralement invariants vis‑à‑vis des durées de vie : une référence courte ne peut pas être stockée dans un champ attendu pour une référence plus longue. Le bug identifié montre que, sous certaines conditions de covariant field assignment, le compilateur accepte une assignation qui transforme implicitement la variance du champ, permettant ainsi d'injecter une référence dont la durée de vie est plus courte que celle déclarée. Cette transformation n'est pas détectée par l'analyse du borrow checker, créant une situation où le code peut libérer une donnée alors qu'une référence active subsiste.

Impact sur la sûreté du langage

Le contournement viole le principe fondamental de Rust : « aucune référence dangling ». En pratique, un programme exploitant ce chemin peut déclencher un use‑after‑free ou un data race si la référence est partagée entre threads. Bien que le défaut soit rare et nécessite une combinaison précise d'assignations, il montre que le modèle de variance actuel ne couvre pas toutes les interactions entre champs et lifetimes. Le fait que le problème soit resté non détecté pendant plus d'une décennie indique des limites dans les tests de conformité du compilateur et dans les outils d'analyse statique utilisés par la communauté.

Perspectives de correction

La résolution proposée consiste à renforcer la vérification de la variance lors de l'assignation de champs, en introduisant une étape de variance checking qui compare explicitement les lifetimes source et cible. Cette modification implique une mise à jour du module de résolution du borrow checker, potentiellement impactant la performance de compilation mais assurant une cohérence stricte avec les règles de lifetimes. En attendant le correctif, les développeurs sont invités à auditer les structures contenant des références génériques et à éviter les assignations qui pourraient déclencher une covariance implicite. Le suivi de l'issue indique que le correctif sera intégré dans une prochaine version stable, après validation via le suite de tests de regression du compilateur.