unsafe_rust

This commit is contained in:
gbrochar 2020-12-08 20:06:43 +01:00
parent 191e5af4c7
commit fb508b86fd
2 changed files with 74 additions and 0 deletions

9
unsafe_rust/Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "unsafe_rust"
version = "0.1.0"
authors = ["gbrochar <gaetanbrochard@protonmail.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

65
unsafe_rust/src/main.rs Normal file
View File

@ -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);
}
}