當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust from_raw_parts用法及代碼示例


本文簡要介紹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-lang.org大神的英文原創作品 Function core::slice::from_raw_parts。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。