柚子快報激活碼778899分享:rust學習-不安全操作
柚子快報激活碼778899分享:rust學習-不安全操作
在 Rust 中,不安全代碼塊用于避開編譯器的保護策略
四種不安全操作
解引用裸指針
通過 FFI (Foreign Function Interface,外部語言函數(shù)接口)調(diào)用函數(shù)
調(diào)用不安全的函數(shù)
內(nèi)聯(lián)匯編(inline assembly)
解引用裸指針
原始指針(raw pointer,裸指針)* 和引用 &T 有類似的功能 引用總是安全的,因為借用檢查器保證了它指向一個有效的數(shù)據(jù) 解引用不安全,一個裸指針只能通過不安全代碼塊執(zhí)行
fn main() {
let raw_p: *const u32 = &10;
unsafe {
assert!(*raw_p == 10);
}
}
調(diào)用不安全函數(shù)
使用了 Rust 的 unsafe 特性 從原生指針中創(chuàng)建 slice 是不安全的,需要手動來確保指針和長度的正確性
use std::slice;
fn main() {
// 定義一個包含四個元素的 Vector
let some_vector = vec![1, 2, 3, 4];
// 獲取指向 Vector 對象的原始指針和長度
let pointer = some_vector.as_ptr();
let length = some_vector.len();
// 不安全操作,使用unsafe塊
unsafe {
// 通過原始指針和長度創(chuàng)建一個 u32 類型的不可變 slice
let my_slice: &[u32] = slice::from_raw_parts(pointer, length);
// 使用 assert_eq! 宏進行斷言,比較 Vector 和轉換后的 slice 是否相等
assert_eq!(some_vector.as_slice(), my_slice);
}
}
附錄
切片
&[u32] 是一個不可變的切片類型,也稱為引用切片(slice reference) 用于表示一個基于某個 u32 類型的數(shù)組或向量的引用部分 它由一個指向數(shù)據(jù)的指針和一個長度值組成 指針指向數(shù)組或向量中第一個元素的地址 長度則表示這個切片包含的元素數(shù)目 常用于接收函數(shù)的參數(shù)/返回函數(shù)的結果
// 將數(shù)組或者向量轉為slice切片
fn fn_name(slice: &[u32]) -> u32 {
let mut sum = 0;
for i in 0..slice.len() {
sum += slice[i];
}
sum
}
fn main() {
let array = [1
柚子快報激活碼778899分享:rust學習-不安全操作
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。