Creating a mutable reference from an immutable one is unsound because it can lead to multiple live mutable references to the same object, breaking Rust’s guarantees of memory safety. Such patterns are particularly dangerous if unsafe code is present as it can lead to undefined behavior.
fn foo(x: &Foo) -> &mut Bar {
unsafe {
// Noncompliant: Converting immutable reference to mutable.
&mut *(x as *const Foo as *mut Foo).bar
}
}
fn foo(x: &mut Foo) -> &mut Bar {
// Compliant: Taking a mutable reference and returning a mutable reference.
&mut x.bar
}