是否有基于静态分析(例如,通过优化程序的compile_error的替代方法)

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

我有一个称为foo的函数。

fn foo(val: bool) {
   if val {
      panic!("This should not ever happened");
   } else {
      // do something useful
   }
}

// somewhere else
foo(true); // this should cause compile error

我想要的是停止编译,如果编译器确定的话,将使用foo值调用函数true。我想尽快得到通知(因此编译时间比运行时要好)。所以我想要类似compile_error!但基于静态分析的东西。如果编译器不确定是否调用true分支,则绝对可以进行编译-程序在运行时会出现紧急情况。

compile_error!对我来说可悲的是无法使用,因为我不希望以下代码在编译时失败

if false {
   compile_error!("Some error");
}
rust
1个回答
1
投票

compile_error!无法做到这一点。在代码优化之类的事情发生之前,对宏进行了评估。目前只有compile_error!在两种情况下有用:

  • 使用#[cfg(...)]进行有条件编译
  • 可能会包含compile_error!的宏生成代码

这两者均在发出compile_error!错误之前进行评估。

没有很好的功能可以让您做自己想做的事情。但是,存在一种hack。它由the no-panic crate使用,并在链接时导致错误(在Rust中通常很少见)。

该技巧通过在每个紧急位置插入对未知符号的引用来起作用。如果优化器(在编译管道中运行得很晚,但仍主要在链接之前运行)可以删除通往no-panic的分支,则它也会删除对未知符号的引用。如果优化器无法删除该分支,则最终代码将包含对该未知符号的引用,链接器将生成“对...的未定义引用”错误。这不是一个很好的错误,但会阻止程序编译。

不过,您的目标还有些复杂:如果编译器确定绝对会发生恐慌,则只希望出错。这比较棘手,但是您也可以使用此技巧来解决它。

© www.soinside.com 2019 - 2024. All rights reserved.