rust - 测试溢出时忽略 Cargo build --release 选项

标签 rust build release rust-cargo mode

我一直在逐步阅读 Programming Rust 书,并想观察两者的补码包装,如此简单的代码:

fn main() {

    let mut x: u8 = 255;
    println!("the value of x is {}", x) ;
    x = 255 + 1 ;
    println!("The value of x now is {}",x) ;
}
当我尝试按照指南使用 Cargo 编译它时,我运行
cargo 构建--发布
书中说会让它在没有溢出保护的情况下编译,但它不会编译。我收到保护错误
|
6 | x = 255 + 1 ;
| ^^^^^^^^^^^ 尝试计算 u8::MAX + 1_u8 , 会溢出
你能解释一下我做错了什么吗?

最佳答案

我相信在运行时不会动态检查该值(它不会 panic 并且会溢出),但在编译期间仍会静态检查(如果可能的话)。
在这种情况下,编译器能够在编译时确定您要执行的操作并阻止您执行此操作。
话虽如此,如果您查看编译器输出,您会看到以下消息:

note: #[deny(arithmetic_overflow)] on by default


无论优化级别如何,您都会看到此消息。
如果您想观察溢出,请输入以下 inner attribute在源文件的顶部。
#![allow(arithmetic_overflow)]
或者,如果您使用 rustc 进行编译您可以直接传递以下标志:
-O -A arithmetic_overflow
rustc文档显示默认情况下以下 lints 处于打开状态(无论优化级别如何)
  • ambiguous_related_items
  • 算术溢出
  • 冲突的_repr_hints
  • const_err
  • 病态属性输入
  • 不完整的包含
  • invalid_type_param_default
  • macro_expanded_macro_exports_accessed_by_absolute_paths
  • missing_fragment_specifier
  • 可变转换
  • no_mangle_const_items
  • order_dependent_trait_objects
  • 溢出文字
  • patterns_in_fns_without_body
  • pub_use_of_private_extern_crate
  • 软不稳定
  • 无条件 panic
  • unknown_crate_types
  • useless_deprecated
  • 关于rust - 测试溢出时忽略 Cargo build --release 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66484430/

    相关文章:

    ffmpeg 缓冲区未释放

    rust - assert_eq 的可变和不可变借用问题

    c - 为 C/FFI 库调用分配对象

    gradle - 如何更改 gradle 插件存储库?

    java - 未在构建项目中导出映射器文件 (*.xml)。使用mybatis

    debugging - Cmake 忽略 CMAKE_BUILD_TYPE=Debug

    rust - 使用 Cargo 使较低级别的 crate 在顶部可用

    rust - s 生命周期不够长 : borrowed value does not live long enough;

    build - Docker Hub自动构建失败。本地构建很好

    java - React-Native 构建发布apk 执行aapt失败