gpt4 book ai didi

rust - `unsafe` 函数的最佳实践是什么,其中只有一小部分代码实际上在做 `unsafe` 的事情?

转载 作者:行者123 更新时间:2023-11-29 08:24:16 29 4
gpt4 key购买 nike

在我正在开发的 crate 中,我有几个 unsafe 函数,由于某些原因它们被标记为 explained in this answer .在 unsafe 函数中,我可以执行 unsafe 操作,就好像完整的函数体被包裹在 unsafe{} block 中一样。

问题在于,在较大的函数中,只有一小部分函数体实际上在执行不安全 操作,而其余部分在执行完全安全的操作。通常,这种安全的东西甚至完全独立于 unsafe 代码。在这些更大的函数中,我想缩小不安全操作的范围。原因应该很容易理解:我也不会仅仅因为可以就将我的完整代码库包装在 unsafe{} block 中。

不幸的是,没有一个safe{} block 来“反转”unsafe 函数的行为。如果有我会这样使用它:

unsafe fn my_function() {
safe {
// ... doing safe stuff ...

unsafe {
// ... doing `unsafe` stuff ...
}

// ... doing safe stuff ...
}
}

但这是不可能的:在这些情况下缩小不安全操作范围的最佳实践是什么?是否有既定的技巧来解决这个问题?

需要说明的是:这个问题并不是要讨论缩小unsafe 范围是好是坏。我说我想做:这个问题是关于如何做的以及什么解决方案(如果有的话)在实践中最常用。 (如果你不明白我为什么要这样做,this RFC 非常相关。)

最佳答案

如果您想使用 unsafe 关键字来对所有不安全的操作进行分类,您可以通过将代码拆分为安全的私有(private)函数来构造更准确的边界。我不确定它是否完全符合您对“最佳实践”的要求,因为我不知道有任何大型项目使用该技术,但它会起作用:

// Document the assumptions of this unsafe function here
pub unsafe fn my_function() {
my_internal_function()
}

// private
fn my_internal_function() {
// ... doing safe stuff ...
unsafe {
// Document the assumptions of this unsafe block here
// ... doing `unsafe` stuff ...
}
// ... doing safe stuff ...
}

如果您担心存在实际上使用起来不安全的“安全”函数,引入意外被错误使用的风险,您可以嵌套这些私有(private)函数,这样它们就不能在主要不安全函数之外调用:

pub unsafe fn my_function() {
fn my_internal_function() {
// ... doing safe stuff ...
unsafe {
// Document the assumptions of this unsafe block here
// ... doing `unsafe` stuff ...
}
// ... doing safe stuff ...
}

my_internal_function();
}

毕竟,正确记录不安全代码的假设和注释是最重要的部分。这种技巧只有在您关注不安全行数的指标时才有用。

关于rust - `unsafe` 函数的最佳实践是什么,其中只有一小部分代码实际上在做 `unsafe` 的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57522200/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com