Retour à la leçon
Mission

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.