Rust 是否有基于静态分析的编译错误的替代方法(例如,通过优化器)

Rust 是否有基于静态分析的编译错误的替代方法(例如,通过优化器),rust,Rust,我有一个名为foo的函数 fn foo(val:bool){ 如果val{ 恐慌!(“这不应该发生”); }否则{ //做些有用的事 } } //其他地方 foo(真的);//这将导致编译错误 我想要的是停止编译,如果编译器确信,将使用true值调用函数foo。我希望尽快得到通知(因此编译时比运行时更好)。所以我想编译类似于的错误但基于静态分析。如果编译器不确定是否调用true分支,编译它是完全可以的-程序在运行时会死机 编译错误对我来说是不可用的,因为我不希望下面的代码在编译时失败 如果为f

我有一个名为
foo
的函数

fn foo(val:bool){
如果val{
恐慌!(“这不应该发生”);
}否则{
//做些有用的事
}
}
//其他地方
foo(真的);//这将导致编译错误
我想要的是停止编译,如果编译器确信,将使用
true
值调用函数
foo
。我希望尽快得到通知(因此编译时比运行时更好)。所以我想编译类似于
的错误但基于静态分析。如果编译器不确定是否调用
true
分支,编译它是完全可以的-程序在运行时会死机

编译错误
对我来说是不可用的,因为我不希望下面的代码在编译时失败

如果为false{
编译错误!(“某些错误”);
}

这是不可能的,因为
编译错误。宏是在代码优化等事情发生之前进行计算的。基本上只有两种情况下
compile\u出错现在很有用:

  • 使用
    #[cfg(…)]
  • 宏生成的代码可能包含
    compile\u错误
这两个都是在
compile\u错误之前计算的错误

没有什么好的功能可以让你实现你想要实现的目标。然而,存在一种黑客行为。它由用户使用,并在链接时导致错误(在Rust中您通常很少看到这种情况)

该技巧的工作原理是在每个位置插入对未知符号的引用。如果优化器(在编译管道中运行得很晚,但仍然主要在链接之前)可以删除导致
死机的分支,那么它也会删除对未知符号的引用。如果优化器无法删除该分支,则最终代码包含对该未知符号的引用,链接器将生成“未定义对…”的引用”错误。这不是一个很好的错误,但它会阻止程序编译


不过,您的目标有点复杂:只有在编译器确信绝对会发生死机的情况下,您才需要一个错误。这是更棘手的,但你也可以用这个黑客来解决它

您是否可以添加一个更复杂的示例?实际上,您可以通过完全删除参数来避免这种情况。在更一般的情况下,您可以尝试使类型系统不允许您想要的内容,但仅此示例很难说清楚。可能有助于优化,但我认为目前没有任何类型的静态分析可用,至少在没有编译器插件的语言中没有。@loganfsmyth我没有。问题是,在小项目中,我可以以某种方式阻止它,在大项目中,不同开发人员的更改组合很容易导致它。在我看来,这不是一个优化问题,而是一个不变的执行问题。也就是说,您不希望其他人使用值
true
调用您的
foo
。如果这是您想要的,请尝试宏
std::debug\u assert