Retour à la leçonMission
Mission : une abstraction unsafe qui viole ses propres garanties
Diagnostiquer un comportement indéfini dans une fonction unsafe inspirée de split_at_mut, puis la corriger avec les vérifications manquantes.
Contexte
Un développeur junior, inspiré par le pattern split_at_mut vu en cours, écrit une fonction censée renvoyer des références mutables vers le premier et le dernier élément d'un slice, pour les modifier simultanément :
rust
fn premier_et_dernier_mut(slice: &mut [i32]) -> (&mut i32, &mut i32) {
let len = slice.len();
let ptr = slice.as_mut_ptr();
unsafe {
(&mut *ptr, &mut *ptr.add(len - 1))
}
}Le code compile sans le moindre avertissement. En test avec un slice de 5 éléments, tout fonctionne. Mais une fois déployée, l'équipe observe des plantages aléatoires et des valeurs aberrantes en production, sur des appels qu'elle n'arrive pas à reproduire de façon fiable en local.