相关疑难解决方法(0)

释放模式下安全 Rust 中的有符号整数溢出是否被视为未定义行为?

Rust 在调试和发布模式下以不同的方式处理有符号整数溢出。当它发生时,Rust 在调试模式下会发生恐慌,而在发布模式下默默地执行二进制补码包装。

据我所知,C/C++ 将有符号整数溢出视为未定义行为,部分原因是:

  1. 在 C 标准化的那个时候,表示有符号整数的不同底层体系结构,例如补码,可能仍在某处使用。编译器无法假设硬件中如何处理溢出。
  2. 后来的编译器因此做出假设,例如两个正整数之和也必须为正数才能生成优化的机器代码。

因此,如果 Rust 编译器确实在有符号整数方面执行与 C/C++ 编译器相同类型的优化,那么为什么The Rustonomicon指出:

无论如何,Safe Rust 不会导致未定义行为。

或者即使 Rust 编译器不执行这样的优化,Rust 程序员仍然不希望看到有符号整数环绕。不能称为“未定义行为”吗?

integer-overflow rust llvm-codegen

5
推荐指数
1
解决办法
1070
查看次数

标签 统计

integer-overflow ×1

llvm-codegen ×1

rust ×1