【问题标题】:If I return a Vec buffer and a pointer to its internal data, is the pointer valid?如果我返回一个 Vec 缓冲区和一个指向其内部数据的指针,该指针是否有效?
【发布时间】:2022-12-06 21:24:25
【问题描述】:

我正在编写一些 C FFI 绑定,但我遇到了一种情况,我不确定它是否有效。以最简单的形式,它将是:

unsafe fn foo() -> (*const u8, Vec<u8>) {
    let buf = vec![0, 1, 2];
    (buf.as_ptr(), buf)
}

现在使用它:

fn main() {
    let (ptr, _buf) = foo();

    // pass ptr to C function...
}

在上面的示例中,ptr 是否有效,因为 _buf 一直存在到范围结束?

【问题讨论】:

  • 请注意,如果您将 Vec 替换为 Box,那么 Miri 会抱怨(请参阅我的回答)。
  • @ChayimFriedman 如果我们使用Pin&lt;Box&gt; 会怎么样?
  • Pin 根本没有改变别名规则。如果有的话,它是Unpin,这只是一个临时的 hack。

标签: pointers rust lifetime unsafe


【解决方案1】:

问题是移动 Vec 是否会使指向它的指针无效。答案是,还没有决定。

这是UCG issue #326

所以最好在决定之前避免使用这样的代码。但就其价值而言,由于很多代码都依赖于它来工作,我不相信它会被判定为无效。

【讨论】:

  • 什么是最安全的方法?
  • @rodrigocfd 不要那样做:)
  • 顺便说一句,你所说的“定居”是什么意思?
  • 看起来像个错误,我不是母语人士。
猜你喜欢
  • 2013-10-28
  • 2014-08-13
  • 2019-12-28
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多