study_example/advance_feature/
unsafe_rust.rs1use core::slice;
2
3fn define_raw_pointer() {
11 let mut num = 10;
12 let r1 = &num as *const i32;
13 let r2 = &mut num as *mut i32;
14 let address = 0x012345usize;
15 let r = address as *const i32;
16
17 unsafe {
18 println!("r1 is {}", *r1);
19 println!("r2 is {}", *r2);
20 }
22}
23
24unsafe fn dangerous() {}
31
32fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
40 let len = values.len();
41 let ptr = values.as_mut_ptr();
42 assert!(mid <= len);
43 unsafe {
44 (
45 slice::from_raw_parts_mut(ptr, mid),
46 slice::from_raw_parts_mut(ptr.add(mid), len - mid),
47 )
48 }
49}
50
51fn create_safe_abstract_over_unsafe_code() {
57 let mut v = vec![1, 2, 3, 4, 5, 6];
58 let r = &mut v[..];
59 let (a, b) = split_at_mut(r, 3);
61 println!("a: {:?}", a);
62 println!("b: {:?}", b);
63}
64
65extern "C" {
67 fn abs(input: i32) -> i32;
68}
69
70#[no_mangle]
72pub extern "C" fn call_from_c() {
73 println!("Just call a Rust function from C!");
74}
75
76static HELLO_RUST: &str = "Hello, Rust!";
77static mut COUNTER: u32 = 0;
78fn add_to_count(inc: u32) {
79 unsafe {
80 COUNTER += inc;
81 }
82}
83
84unsafe trait Foo {
85 }
87
88unsafe impl Foo for i32 {}
89
90pub fn unsafe_rust_study() {
97 define_raw_pointer();
98 add_to_count(3);
99 unsafe {
100 dangerous();
101 println!("Absolute value of -3 according to C: {}", abs(-3));
102 println!("COUNTER: {}", COUNTER);
103 }
104 create_safe_abstract_over_unsafe_code();
105 println!("global static string: {}", HELLO_RUST);
106}