仅由不安全代码块组成的Rust函数是否有任何用途?

仅由不安全代码块组成的Rust函数是否有任何用途?,rust,Rust,代码是从中复制的。这是为了说明可变静态变量的使用,但这不是我在这里关心的问题。尽管这可能被冠以“玩具的例子”,但在一本介绍生锈的书中,它提出了我认为是严重的问题 add_to_count的所有代码都位于不安全块中。与使函数本身不安全相比,这有什么好处?照目前的情况,函数的签名没有提供任何线索表明它本质上是不安全的。我想知道为什么编译器甚至允许这样做。“好处”是,如下所示,可以在不安全的块之外调用该函数。为什么一篇关于Rust的介绍性文章会展示如何规避安全编程实践 static mut COUNT

代码是从中复制的。这是为了说明可变静态变量的使用,但这不是我在这里关心的问题。尽管这可能被冠以“玩具的例子”,但在一本介绍生锈的书中,它提出了我认为是严重的问题

add_to_count
的所有代码都位于
不安全
块中。与使函数本身不安全相比,这有什么好处?照目前的情况,函数的签名没有提供任何线索表明它本质上是不安全的。我想知道为什么编译器甚至允许这样做。“好处”是,如下所示,可以在
不安全的
块之外调用该函数。为什么一篇关于Rust的介绍性文章会展示如何规避安全编程实践

static mut COUNTER: u32 = 0;

fn add_to_count(inc: u32) {
    unsafe {
        COUNTER += inc;
    }
}

fn main() {
    add_to_count(3);

    unsafe {
        println!("COUNTER: {}", COUNTER);
    }
}

如果函数被标记为不安全
,则表示调用方负责维护一些条件,否则可能会引入未定义的行为

如果函数未标记为不安全的
,但包含不安全的代码,则表示该函数保证任何参数选择都不会导致不安全行为。在实践中,这通常意味着函数将检查某些条件,如果不满足这些条件,则会出现死机


在您的示例中,作者没有将函数标记为
不安全
,因此作者断言,通过将
静态mut u32
按调用方定义的数量进行变异,不会出现任何问题。

OP似乎将两个问题混为一谈。他们在标题中提出的问题(您回答得很好)以及隐含的“此代码是否正确使用了
不安全的
”。如果你也能触及到这一点,那就太好了。也许还可以谈谈“编译器为什么允许这样做”和“规避安全编程实践”的感受实际上,我省略了关于是否遵循良好实践的讨论,主要是因为我不太清楚
静态mut
对于P.O.D.拷贝类型来说是否会变得不安全。最佳做法可能是在函数中留下某种
//安全:…
注释…@Shepmaster如果你想添加这些内容,你可能就是这个工作的人选。我能找到我的答案。可能还需要提及。