本文简要介绍rust语言中 Function std::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_raw_parts用法及代码示例
- 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-lang.org大神的英文原创作品 Function std::slice::from_raw_parts。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。