Ожидается арифметическое переполнение, но не происходит

(Я использую Rust 1.44.1)

Следующий пример не может быть построен (режим отладки) из-за арифметического переполнения (и я понимаю, почему):

fn main() {
    let i: u8 = 255 + 1;
}
error: this arithmetic operation will overflow
 --> src/main.rs:2:17
  |
2 |     let i: u8 = 255 + 1;
  |                 ^^^^^^^ attempt to add with overflow
  |
  = note: `#[deny(arithmetic_overflow)]` on by default

Хотя этот пример строится правильно:

fn main() {
    let i: u8 = 255;
    let _j: u8 = i + 1;
}

поскольку i неизменен, я ожидал такой же ошибки, как и в первом примере.

Я что-то упустил или что-то не обрабатывается компилятором?

1 ответ

Решение

Прежде всего, следует отметить, что предупреждения выдаются с максимальной эффективностью.

В целом хорошая политика для предупреждений:

  • Чтобы избежать ложных срабатываний: нет ничего более раздражающего для пользователя, чем предупреждение о проблеме, когда ее нет.
  • И, следовательно, могут иметь ложноотрицательные результаты: ситуации, которые должны были вызвать предупреждение, но не были обнаружены.

Кроме того, из соображений производительности анализ может быть ограничен самыми основными шаблонами, что еще раз означает, что некоторые события не будут обнаружены.


С учетом сказанного, предупреждение правильно срабатывает в Rust 1.45.

В результате, я полагаю, вы просто попали в ограничение версии 1.44.1.

Другие вопросы по тегам