本文簡要介紹rust語言中 Function core::slice::from_raw_parts
的用法。
用法
pub unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T]
從一個指針和一個長度形成一個切片。
len
參數是數量元素,而不是字節數。
安全性
如果違反以下任何條件,則行為未定義:
-
對於
len * mem::size_of::<T>()
多個字節的讀取,data
必須是 valid,並且必須正確對齊。這尤其意味著:- 該切片的整個內存範圍必須包含在單個分配的對象中!切片永遠不能跨越多個分配的對象。請參閱下麵的示例,錯誤地沒有考慮到這一點。
data
必須為非空且對齊,即使對於零長度切片也是如此。這樣做的一個原因是枚舉布局優化可能依賴於對齊的引用(包括任何長度的切片)和非空值,以將它們與其他數據區分開來。您可以使用NonNull::dangling()
獲取可用作零長度切片的data
的指針。
-
data
必須指向len
類型為T
的連續正確初始化的值。 -
返回的切片引用的內存在
'a
的生命周期內不得發生突變,除了在UnsafeCell
內。 -
切片的總大小
len * mem::size_of::<T>()
不得大於isize::MAX
。請參閱pointer::offset
的安全文檔。
警告
返回的切片的生命周期是從其使用情況中推斷出來的。為了防止意外誤用,建議將生命周期與上下文中安全的源生命周期聯係起來,例如通過提供一個輔助函數來獲取切片的主機值的生命周期,或者通過顯式注釋。
例子
use std::slice;
// manifest a slice for a single element
let x = 42;
let ptr = &x as *const _;
let slice = unsafe { slice::from_raw_parts(ptr, 1) };
assert_eq!(slice[0], 42);
使用不當
下列join_slices
函數是不健全的⚠️
use std::slice;
fn join_slices<'a, T>(fst: &'a [T], snd: &'a [T]) -> &'a [T] {
let fst_end = fst.as_ptr().wrapping_add(fst.len());
let snd_start = snd.as_ptr();
assert_eq!(fst_end, snd_start, "Slices must be contiguous!");
unsafe {
// The assertion above ensures `fst` and `snd` are contiguous, but they might
// still be contained within _different allocated objects_, in which case
// creating this slice is undefined behavior.
slice::from_raw_parts(fst.as_ptr(), fst.len() + snd.len())
}
}
fn main() {
// `a` and `b` are different allocated objects...
let a = 42;
let b = 27;
// ... which may nevertheless be laid out contiguously in memory: | a | b |
let _ = join_slices(slice::from_ref(&a), slice::from_ref(&b)); // UB
}
相關用法
- Rust from_u32_unchecked用法及代碼示例
- Rust from_fn用法及代碼示例
- Rust from_utf8_unchecked用法及代碼示例
- Rust from_digit用法及代碼示例
- Rust from_u32用法及代碼示例
- Rust from_utf8用法及代碼示例
- Rust from_utf8_mut用法及代碼示例
- Rust from_boxed_utf8_unchecked用法及代碼示例
- Rust from_utf8_unchecked_mut用法及代碼示例
- Rust f32.exp用法及代碼示例
- Rust f32.hypot用法及代碼示例
- Rust f32.minimum用法及代碼示例
- Rust f64.signum用法及代碼示例
- Rust f64.sqrt用法及代碼示例
- Rust f32.sqrt用法及代碼示例
- Rust f32.abs_sub用法及代碼示例
- Rust f64.is_finite用法及代碼示例
- Rust f32.cos用法及代碼示例
- Rust f32.is_sign_positive用法及代碼示例
- Rust f32.log10用法及代碼示例
- Rust f64.round用法及代碼示例
- Rust format_args用法及代碼示例
- Rust f32.total_cmp用法及代碼示例
- Rust f64.div_euclid用法及代碼示例
- Rust f64.hypot用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Function core::slice::from_raw_parts。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。