· 6 years ago · Feb 11, 2019, 11:32 PM
1mod ralloc {
2 use ::std::{
3 mem::ManuallyDrop,
4 ops::{Deref, DerefMut},
5 };
6
7 #[derive(Debug)]
8 pub struct ZeroDropBox<T> /* = */ (Box< ManuallyDrop<T> >);
9
10 impl<T> Drop for ZeroDropBox<T>
11 {
12 fn drop (
13 self: &mut Self,
14 )
15 { unsafe {
16 ManuallyDrop::drop(&mut self.0);
17 ::std::ptr::write_volatile(
18 &mut self.0 as &mut T,
19 ::std::mem::zeroed(),
20 );
21 // we could even go as far as to zero the pointer itself ...
22 }}
23 }
24
25 impl<T> From<T> for ZeroDropBox<T>
26 {
27 #[inline(always)]
28 fn from (inline_value: T) -> Self
29 {
30 ZeroDropBox(
31 Box::new(
32 ManuallyDrop::new(
33 inline_value
34 )
35 )
36 )
37 }
38 }
39
40 impl<T> Deref for ZeroDropBox<T>
41 {
42 type Target = T;
43
44 #[inline]
45 fn deref (
46 self: &Self,
47 ) -> &Self::Target
48 {
49 &self.0
50 }
51 }
52 impl<T> DerefMut for ZeroDropBox<T>
53 {
54 #[inline]
55 fn deref_mut (
56 self: &mut Self,
57 ) -> &mut Self::Target
58 {
59 &mut self.0
60 }
61 }
62}
63pub use self::ralloc::ZeroDropBox;
64
65fn main ()
66{
67 let mut secret_key = ZeroDropBox::from([42_u8; 16]);
68 dbg!(&secret_key as &[u8; 16]);
69 let secret_key_after_free: &[u8; 16] = unsafe {
70 &*(&secret_key as &[u8; 16] as *const _)
71 };
72 ::std::mem::drop(secret_key);
73 dbg!(secret_key_after_free);
74}