From fb508b86fdb9d628842cd0f9796f6df256b9f536 Mon Sep 17 00:00:00 2001 From: gbrochar Date: Tue, 8 Dec 2020 20:06:43 +0100 Subject: [PATCH] unsafe_rust --- unsafe_rust/Cargo.toml | 9 ++++++ unsafe_rust/src/main.rs | 65 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 unsafe_rust/Cargo.toml create mode 100644 unsafe_rust/src/main.rs diff --git a/unsafe_rust/Cargo.toml b/unsafe_rust/Cargo.toml new file mode 100644 index 0000000..3ff03ff --- /dev/null +++ b/unsafe_rust/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "unsafe_rust" +version = "0.1.0" +authors = ["gbrochar "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/unsafe_rust/src/main.rs b/unsafe_rust/src/main.rs new file mode 100644 index 0000000..310abbc --- /dev/null +++ b/unsafe_rust/src/main.rs @@ -0,0 +1,65 @@ +use std::slice; + +unsafe fn dangerous() { +} + +fn split_at_mut(slice: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { + let len = slice.len(); + let ptr = slice.as_mut_ptr(); + + assert!(mid <= len); + + unsafe { + ( + slice::from_raw_parts_mut(ptr, mid), + slice::from_raw_parts_mut(ptr.add(mid), len - mid), + ) + } +} + +extern "C" { + fn abs(input: i32) -> i32; +} + +static mut COUNTER: u32 = 0; + +fn add_to_count(inc: u32) { + unsafe { + COUNTER += inc; + } +} + +fn main() { + let mut num = 5; + + let r1 = &num as *const i32; + let r2 = &mut num as *mut i32; + + unsafe { + println!("r1 is: {}", *r1); + println!("r2 is: {}", *r2); + } + + unsafe { + dangerous(); + } + + let mut v = vec![1, 2, 3, 4, 5, 6]; + + let r = &mut v[..]; + + let (a, b) = split_at_mut(r, 3); + + assert_eq!(a, &mut [1, 2, 3]); + assert_eq!(b, &mut [4, 5, 6]); + + unsafe { + println!("Absolute value of -3 according to C: {}", abs(-3)); + } + + add_to_count(3); + + unsafe { + println!("COUNTER: {}", COUNTER); + } +}