Как отключить целочисленную защиту от переполнения?

Мой Rust по умолчанию имеет целочисленную защиту от переполнения и остановит выполнение программы при переполнении. Большое количество алгоритмов требует переполнения для правильной работы (SHA1, SHA2 и т. Д.)

3 ответа

Решение

Использовать Wrapping введите или используйте функции переноса напрямую. Они отключают проверки переполнения. Wrapping Тип позволяет использовать обычные операторы как обычно.

Кроме того, когда вы компилируете свой код в режиме "релиз" (например, с cargo build --release), проверки переполнения опущены для повышения производительности. Однако не полагайтесь на это, используйте приведенный выше тип или функции, чтобы код работал даже в отладочных сборках.

Ответ Фрэнсиса Ганьи - абсолютно правильный ответ для вашего случая. Однако я скажу, что есть опция компилятора, чтобы отключить проверки переполнения. Я не вижу никакой причины использовать его, но он существует и может быть также известен о:

use std::u8;

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

Скомпилировано и запущено:

$ rustc overflow.rs
$ ./overflow
thread '<main>' panicked at 'arithmetic operation overflowed', overflow.rs:4

$ rustc -Z force-overflow-checks=no overflow.rs
$ ./overflow
$

Для тех, кто пришел из будущего, rust будет проверять арифметическое переполнение, даже если вы компилируете 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
Другие вопросы по тегам