算术溢出预期但没有发生
Arithmetic overflow expected but does not occur
(我使用的是 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
是不可变的,我预计会出现与第一个示例相同的错误。
我是不是遗漏了什么或者这是编译器没有处理的?
首先,应该注意发出警告尽最大努力。
一般来说,好的警告策略是:
- 为了避免误报:当 none.
出现问题时,没有什么比警告用户更烦人的了
- 因此可能存在漏报:本应触发警告但未检测到的情况。
此外,出于性能考虑,分析可能仅限于最基本的模式,这再次意味着将不会检测到某些事件。
话虽如此,警告已在 Rust 1.45 上正确触发。
因此,我认为您只是遇到了 1.44.1 版本的限制。
(我使用的是 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
是不可变的,我预计会出现与第一个示例相同的错误。
我是不是遗漏了什么或者这是编译器没有处理的?
首先,应该注意发出警告尽最大努力。
一般来说,好的警告策略是:
- 为了避免误报:当 none. 出现问题时,没有什么比警告用户更烦人的了
- 因此可能存在漏报:本应触发警告但未检测到的情况。
此外,出于性能考虑,分析可能仅限于最基本的模式,这再次意味着将不会检测到某些事件。
话虽如此,警告已在 Rust 1.45 上正确触发。
因此,我认为您只是遇到了 1.44.1 版本的限制。