Déférencement mutable

main.rs
#[derive(Debug)] 
struct S1 { 
    texte: String 
} 
 
#[derive(Debug)] 
struct S2<'a> { 
    reference: &'a S1 
} 
 
fn main() { 
    let mut o1 = S1 { texte: "coucou ".to_string() }; 
 
    let mut o2 = S2 { reference: &o1 }; 
 
    let mut o3 = S2 { reference: &o1 }; 
 
    let mut ref_o2: *mut S1 = o2.reference as *const S1 as *mut S1; 
 
    unsafe { 
        let mut texte: &mut String = &mut (*ref_o2).texte; 
        texte.push_str("toi !"); 
        println!("{:?}", &texte); 
    } 
 
    println!("(1) o2 = {:?}", o2); 
 
    let mut ref_o2: *mut S1 = o2.reference as *const S1 as *mut S1; 
 
    let ref_o2bis: &mut S1 = unsafe { 
        &mut (*ref_o2) 
    }; 
 
    ref_o2bis.texte.push_str(" ça va ? "); 
 
    println!("(2) o3 = {:?}", o3); 
 
}