Guest User

Untitled

a guest
Jul 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.11 KB | None | 0 0
  1. use std::rc::Rc;
  2. use std::slice;
  3. use std::mem;
  4.  
  5. /*
  6. struct Rc {
  7. ptr: struct NonNull {
  8. pointer: struct RcBox<T: ?Sized> {
  9. strong: struct Cell {
  10. value: struct UnsafeCell {
  11. value: usize
  12. }
  13. },
  14. weak: struct Cell {
  15. value: struct UnsafeCell {
  16. value: usize
  17. }
  18. },
  19. value: T,
  20. },
  21. }
  22. phantom: PhantomData<T>,
  23. }
  24. */
  25. fn main() {
  26. let mut rc = Rc::new(5u32);
  27.  
  28. let mut info = unsafe {
  29. slice::from_raw_parts_mut(&mut rc as *mut _ as *mut u8, mem::size_of::<Rc<u32>>())
  30. };
  31.  
  32. unsafe {
  33.  
  34. let base_ptr = info.as_mut_ptr() as *mut *mut ([usize; 2], u32);
  35.  
  36. println!("{:?}", **base_ptr);
  37.  
  38. (**base_ptr).0[0] = std::usize::MAX; // strong count
  39. (**base_ptr).0[1] = std::usize::MAX; // weak count
  40.  
  41. println!("{:?}", **base_ptr);
  42.  
  43. }
  44.  
  45. let c = rc.clone();
  46.  
  47.  
  48. println!("{:?}", info);
  49.  
  50. }
Add Comment
Please, Sign In to add comment