實際上,我正試圖了解如何使用rust的指標來存盤和加載資料,但是當我運行這段代碼時:
#[cfg(test)]
mod tests{
fn get_pointer<T>(a:T) ->/span> *const i32{
ptr::addr_of!(a)
}
#[test]
fn f(){
unsafe {
let a = 5;
let pointer = get_pointer(a)。
let encoded = bincode::serialize(& (pointer as usize) 。) unwrap()。
let decoded = bincode::deserialize::<usize>(&encoded[.]) 。 unwrap() as *const i32。
let b = std::ptr::read(解密)。
assert_eq!(a, b)。
}
}
}
存盤在b中的值變成了0,而不是5,我無法弄清楚為什么會發生這種情況,如何解決這個問題。
我認為問題的發生是因為a的值在函式回傳指標后被丟棄了,但我不確定這是否正確
。
uj5u.com熱心網友回復:
我認為問題的發生是因為a的值在函式回傳指標后被丟棄了,但我不確定這是否正確uj5u.com熱心網友回復:
嗯,是的,差不多。一個函式的區域只在該函式的范圍記憶體在(這就是為什么如果你試圖回傳一個reference到函式區域的資料,rustc會拒絕編譯),所以
get_pointer回傳一個懸空的指標,序列化和反序列化指標幾乎沒有任何作用,而ptr::read是UB:安全問題
如果違反了以下任何一個條件,行為就無法定義:如果違反了以下任何一個條件,行為就無法定義。
- src必須是有效的。
- src必須對讀數有效。
- src必須是正確對齊的。如果不是這種情況,請使用 read_unaligned。
- src必須指向一個正確初始化的T型別的值。
使用miri運行程式,毫不含糊地標記了這個問題:
error: 未定義的行為:alloc1416的指標在這個分配被釋放后被取消參考。 --> /playground/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod。 rs:703:9。 | 703 | copy_nonoverlapping(src, tmp.as_mut_ptr(),1) 。 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 指標到alloc1416在這個分配被釋放后被取消參考了 | =幫助:這表明在程式中存在一個錯誤:它執行了一個無效的操作,并導致了未定義行為。 =幫助:請參見https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html以了解更多資訊。 = note: inside `std::ptr::read::<i32>` at /playground/. rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:703:9 注意:在 src/main.rs 的 `main`內:12:17。 --> src/main.rs:12:17 | 12 | let b = ptr::read(解密)。 | ^^^^^^^^^^^^^^^^^^我其實是想了解如何用rust的指標來存盤和加載資料的
。這樣做是一個糟糕的想法,你正在步入UB的土地,這意味著所有的賭注都關閉了,你觀察到的東西(在你能觀察到的范圍內)與定義的語意沒有關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/315458.html
標籤:
上一篇:向指標陣列中讀行不作業
