如何在 Rust 中执行不安全的 drop()

问题描述 投票:0回答:1

我需要在 Rust 中执行不安全的

drop()

我希望能够写出相当于:

     object.set_value(&value);
     drop(value);
     ... more stuff with object ...

即使

set_value
被定义为要求
value
object
更长寿。

是的,我知道这完全不安全,而且我知道我“不应该这样做”。但我正在调查一个错误,我需要在此时删除

value
并释放其资源。

是否有办法让

drop
正常工作,或者对
set_value
关于
value
的使用寿命撒谎?


对我正在做的事情进行更长的解释。 在 wgpu-rs 中,WebGPU 的 Rust 实现,两者

struct wgpu::RenderPass
struct wgpu::RenderBundleEncoder
实施
trait wgpu::util::RenderEncoder
.

对于两个结构体之间的许多常见操作,

RenderPass
对函数参数的生命周期没有限制,而
RenderBundleEncoder
要求参数比
self
更长寿。 我试图弄清楚为什么
RenderBundleEncoder
需要更严格,以及是否可以消除这种严格性。

我可以在 Python 中尝试各种实验,它通过 C 接口与 Rust 对话; Python 不尊重 Rust 的生命周期。 但拥有一个全 Rust 测试用例会更容易。

rust unsafe wgpu-rs
1个回答
0
投票

如果不调用至少两种不同类型的未定义行为,这是不可能做到的,这意味着你的测试结果将完全无用。原因是因为允许编译器假设未定义行为永远不会发生;如果它遇到 UB,则可以自由地假设触发 UB 的代码永远不会被实际调用,从而导致它四处寻找不会导致 UB 的附近分支,并假设必须调用该分支。

您需要调用的两种 UB 是:

  • 释放后使用。
  • 非法别名(您需要
    &mut
    才能删除某些内容,并且当您拥有相同值的
    &mut
    时,您无法获得
    &
    )。
© www.soinside.com 2019 - 2024. All rights reserved.