在库编译时是否可以检查`panic`是否设置为`abort`?

ozk*_*iff 7 rust rust-cargo

这可能不是一个好主意或不是惯用的,但我们假设由于某种原因,库依赖catch_unwind于其业务逻辑.

我能以某种方式提醒(用一个错误信息失败编译?)这个库的用户,如果他们开始panic = "abort"Cargo.toml自己的"终端"箱子呢?

我正在考虑检查一些环境变量,build.rs无法找到包含此信息的任何变量.

loo*_*ops 4

-C panic=abort您可以在二进制文件或库中使用此不稳定代码,从而在指定时导致错误:

#![feature(panic_unwind)]
extern crate panic_unwind;
Run Code Online (Sandbox Code Playgroud)

当使用错误的恐慌策略时,这会导致这个有用的错误:

error: the linked panic runtime `panic_unwind` is not compiled with this crate's panic strategy `abort`
Run Code Online (Sandbox Code Playgroud)

当恐慌策略正确时,extern crate声明是多余的,但没有任何作用。当恐慌策略错误时,它会导致链接错误,因为同一个二进制文件中不能有两个不同的恐慌策略箱。由于此检查在链接 crate 时发生,请注意,如果顶级 crate 从未实际使用过库,则不会运行该检查。(但这是一件好事:如果您的库未使用,则无论如何都不需要此检查!)

此外,此错误在编译过程的后期发生,因此虽然cargo build会出错,cargo check但不会抱怨,因为cargo check出于性能原因不会检查链接错误。

不幸的是,似乎没有办法在稳定频道上做到这一点。