solana_stable_layout/
stable_slice.rs

1//! Ensure slice has a stable memory layout
2
3#[cfg(test)]
4mod tests {
5    use std::mem::{align_of, size_of};
6
7    #[test]
8    fn test_memory_layout() {
9        assert_eq!(align_of::<&[i32]>(), 8);
10        assert_eq!(size_of::<&[i32]>(), /*ptr*/ 8 + /*len*/8);
11
12        let array = [11, 22, 33, 44, 55];
13        let slice = array.as_slice();
14
15        let addr_slice = &slice as *const _ as usize;
16        let addr_ptr = addr_slice;
17        let addr_len = addr_slice + 8;
18        assert_eq!(unsafe { *(addr_len as *const usize) }, 5);
19
20        let ptr_data = addr_ptr as *const *const i32;
21        assert_eq!(unsafe { *((*ptr_data).offset(0)) }, 11);
22        assert_eq!(unsafe { *((*ptr_data).offset(1)) }, 22);
23        assert_eq!(unsafe { *((*ptr_data).offset(2)) }, 33);
24        assert_eq!(unsafe { *((*ptr_data).offset(3)) }, 44);
25        assert_eq!(unsafe { *((*ptr_data).offset(4)) }, 55);
26    }
27}