#lint #float #floating-point #compilation #math #plugin #herbie

nightly herbie-lint

A rustc 插件,用于检查数值不稳定性

8 个稳定版本

使用旧的 Rust 2015

1.0.7 2016 年 4 月 8 日
1.0.6 2016 年 3 月 27 日
1.0.5 2016 年 2 月 12 日
1.0.4 2016 年 1 月 26 日
0.1.0 2015 年 12 月 25 日

#1484Rust 模式


用于 dagon

MPL-2.0 许可证

46KB
1K SLoC

Herbie 检查 Rust 构建状态 Crates.io 许可证

是什么

此插件可以在使用数值不稳定的浮点表达式时,为您的 crate 添加警告或错误。

编译 tests/compile-fail/general/test.rs 的快速示例

test.rs:40:5: 40:18 warning: Numerically unstable expression, #[warn(herbie)] on by default
test.rs:40     (a/b + c) * b;
               ^~~~~~~~~~~~~
test.rs:40:5: 40:18 help: Try this
test.rs:       (c * b) + a;
test.rs:67:5: 67:23 warning: Numerically unstable expression, #[warn(herbie)] on by default
test.rs:67     (a*a + b*b).sqrt();
               ^~~~~~~~~~~~~~~~~~
test.rs:67:5: 67:23 help: Try this
test.rs:       a.hypot(b);
test.rs:155:5: 155:30 warning: Numerically unstable expression, #[warn(herbie)] on by default
test.rs:155     (a+b).sin() - (a+b).cos();
                ^~~~~~~~~~~~~~~~~~~~~~~~~
test.rs:155:5: 155:30 help: Try this
test.rs:        (b.sin() * (a.sin() + a.cos())) - ((a.cos() - a.sin()) * b.cos());

如您所见,它将报告数值不稳定的表达式,并建议(有时是过度括号的)更稳定的修正。

用法

插件

这是一个 rustc 插件,要使用它,您需要一个 nightly Rust。

您需要一个可能的修正数据库,此插件才能正常工作。数据库格式与 Herbie GHC 插件(用于 Haskell) 相同,该插件是该插件的灵感来源,因此 此文件 应该可以工作。只需将其放在您调用 cargorustc 的同一目录中即可。

Cargo.toml 中添加

[dependencies]
herbie-lint = "{{VERSION}}"

并在您的 crate 中

#![feature(plugin)]
#![plugin(herbie_lint)]

有关更多信息,请参阅 clippy用法 部分,如果您想了解更多信息并想要更多的 Rust 检查。

配置

如果您不希望插件检查特定的函数或方法,您可以使用 #[herbie_ignore] 属性标记它

fn foo(a: f64, b: f64, c: f64) -> f64 {
    (a/b + c) * b
    // This will suggest to use “(c * b) + a” instead.
}

#[herbie_ignore]
fn bar(a: f64, b: f64, c: f64) -> f64 {
    (a/b + c) * b
    // This won't.
}

您还可以在 Cargo.toml 旁边放置一个 Herbie.toml 文件,其中包含以下字段

# Path to the database.
db_path = "Herbie.db"

# The seed use by Herbie. If not provided, a fixed seed will be used. Fixing
# the seed ensures deterministic builds.
herbie_seed = "#(1461197085 2376054483 1553562171 1611329376 2497620867 2308122621)"

# Allow the plugin to call Herbie on unknown expressions. Positive results from
# Herbie will be cached in the database. WARNING: Herbie is slow.
# If ‘true’, the plugin will fail if it cannot find the executable.
# If ‘false’, the plugin will not try to run Herbie.
# By default, the plugin will call the executable only if it's found, but won't
# complain otherwise.
use_herbie = false

# Maximum time in seconds that Herbie is allowed to play with an expression. If
# null, allow Herbie to run indefinitely. Default is two minutes.
timeout = 120

有关调用 Herbie 的更多信息,请参阅 wiki

致谢

感谢 @llogiq 的 想法

依赖项

~22MB
~422K SLoC