unsafe — bypass safety checks.
Unsafe operations:
1unsafe {2 // Dereference raw pointer3 let mut num = 5;4 let r1 = &mut num as *mut i32;5 *r1 = 10;67 // Call unsafe function8 dangerous_function();910 // Access mutable static11 COUNTER += 1;1213 // Implement unsafe trait14 // impl UnsafeTrait for Type {}15}
Safe abstraction:
1pub fn split_at_mut(slice: &mut [i32], mid: usize)2 -> (&mut [i32], &mut [i32])3{4 let len = slice.len();5 let ptr = slice.as_mut_ptr();67 assert!(mid <= len);89 unsafe {10 (11 std::slice::from_raw_parts_mut(ptr, mid),12 std::slice::from_raw_parts_mut(ptr.add(mid), len - mid),13 )14 }15}
Key: Minimize unsafe blocks, document invariants.