如何关闭整数溢出保护?

How can integer overflow protection be turned off?

我的默认 Rust 启用了整数溢出保护,并且会在溢出时停止执行程序。大量算法需要溢出才能正常运行(SHA1、SHA2 等)

直接使用Wrapping type, or use the wrapping functions。这些禁用溢出检查。 Wrapping 类型允许您照常使用普通运算符。

此外,当您在 "release" 模式下编译代码时(例如 cargo build --release),溢出检查将被忽略以提高性能。不要依赖这个,使用上面的类型或函数,这样代码即使在调试版本中也能工作。

绝对是您的情况的正确答案,但是 一个编译器选项来禁用溢出检查。我看不出有任何理由使用它,但它存在并且可能为人所知:

#![allow(arithmetic_overflow)]

fn main() {
    dbg!(u8::MAX + u8::MAX);
}

通过货运

在您的 profile section 中设置:

[profile.dev]
overflow-checks = false
% cargo run -q
[src/main.rs:6] u8::MAX + u8::MAX = 254

通过rustc

使用-C overflow-checks命令行选项:

% rustc overflow.rs -C overflow-checks=off

% ./overflow
[overflow.rs:6] u8::MAX + u8::MAX = 254

对于那些来自未来的人,rust 检查算法溢出,即使你在发布模式.[=15]下编译src =]

➜  ~ cargo new overflow_test --vcs='none'
     Created binary (application) `overflow_test` package
➜  ~ cd overflow_test
➜  overflow_test vim src/main.rs
➜  overflow_test cat src/main.rs
fn main() {
    let mut max: i32 = i32::MAX;
    max += 1;
}
➜  overflow_test cargo run --release
   Compiling overflow_test v0.1.0 (/home/steve/overflow_test)
// two warnings are omitted
error: this arithmetic operation will overflow
 --> src/main.rs:3:5
  |
3 |     max += 1;
  |     ^^^^^^^^ attempt to compute `i32::MAX + 1_i32`, which would overflow
  |
  = note: `#[deny(arithmetic_overflow)]` on by default

warning: `overflow_test` (bin "overflow_test") generated 2 warnings
error: could not compile `overflow_test` due to previous error; 2 warnings emitted