From cf6725b61f26f368fedc2a4db2eec22f226f03b1 Mon Sep 17 00:00:00 2001 From: pln <Per Lindgren> Date: Thu, 5 Oct 2017 21:52:23 +0200 Subject: [PATCH] !Send !Sync don't work --- src/main.rs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index a8acd12..fb69b90 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ //#![feature(const_size_of)] #![feature(optin_builtin_traits)] +#![feature(const_fn)] //use std::mem::{transmute, size_of}; //use std::marker::Sized; @@ -38,13 +39,15 @@ mod trusted { } impl<T> Sec<T> { - pub unsafe fn new(d: T) -> Self { + pub const unsafe fn new(d: T) -> Self { Sec { data: d } } pub unsafe fn get(&self) -> &T { &self.data } } + impl<T> !Send for Sec<T> {} + impl<T> !Sync for Sec<T> {} // safe API for operating on Sec<u32> pub fn sec_add_u32(s1: &Sec<u32>, s2: &Sec<u32>) -> Sec<u32> { @@ -57,9 +60,9 @@ mod trusted { T: Sized, F: FnMut(&mut u8), { - let ptr: *mut u8 = s as *mut T as *mut u8; + let ptr = s as *mut T as *mut u8; for i in 0..size_of::<T>() { - println!("{} {}", i, unsafe { *ptr.offset(i as isize) } as u8); + //println!("{} {}", i, unsafe { *ptr.offset(i as isize) } as u8); f(unsafe { &mut *ptr.offset(i as isize) }); } } @@ -80,6 +83,10 @@ mod trusted { Enc { data: c } } + pub const unsafe fn new_(d: T) -> Self { + Enc { data: d } + } + pub unsafe fn get_unsafe(&self) -> Sec<T> { let mut c = self.data.clone(); cipher(&mut c, |i| { *i -= 1; }); @@ -102,6 +109,9 @@ fn main() { user1(&d, &e); } +static mut S: Sec<u32> = unsafe { Sec::new(0u32) }; +static mut E: Enc<u32> = unsafe { Enc::new_(0u32) }; + // user code in `safe` Rust fn user1(d: &Sec<u32>, e: &Enc<u32>) { println!("user1 {:?}, {:?}", d, e); @@ -109,6 +119,9 @@ fn user1(d: &Sec<u32>, e: &Enc<u32>) { user2(&sec_add_u32(d, &e.get(a))); user3(d, &e.get(a)); user4(d, e, a); + user5(d, e); + //unsafe { S = *d } + unsafe { S = e.get(a) } } fn user2(d: &Sec<u32>) { @@ -120,7 +133,13 @@ fn user3(d1: &Sec<u32>, d2: &Sec<u32>) { } fn user4(d: &Sec<u32>, e: &Enc<u32>, a: &Auth) { - println!("user3 {:?}", sec_add_u32(d, &e.get(a))); + println!("user4 {:?}", sec_add_u32(d, &e.get(a))); +} + + +fn user5(d: &Sec<u32>, e: &Enc<u32>) { + println!("user5 {:?}, {:?}", d, e); + //unsafe { S = *d } } /* -- GitLab