我需要在 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 测试用例会更容易。
如果不调用至少两种不同类型的未定义行为,这是不可能做到的,这意味着你的测试结果将完全无用。原因是因为允许编译器假设未定义行为永远不会发生;如果它遇到 UB,则可以自由地假设触发 UB 的代码永远不会被实际调用,从而导致它四处寻找不会导致 UB 的附近分支,并假设必须调用该分支。
您需要调用的两种 UB 是:
&mut
才能删除某些内容,并且当您拥有相同值的 &mut
时,您无法获得 &
)。