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 日 |
#1484 在 Rust 模式
用于 dagon
46KB
1K SLoC
Herbie 检查 Rust
是什么
此插件可以在使用数值不稳定的浮点表达式时,为您的 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) 相同,该插件是该插件的灵感来源,因此 此文件 应该可以工作。只需将其放在您调用 cargo
或 rustc
的同一目录中即可。
在 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