Как отключить целочисленную защиту от переполнения?
Мой 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