Rust在Debug模式和Release模式下对待带符号整数溢出的方式不同。当发生溢出时,Rust会在 Debug 模式下 panic,而在 Release 模式下则静默地进行二进制补码包装。
据我所知,C/C++将有符号整数溢出视为未定义行为的部分原因是:
1. 在 C 标准化时期,使用不同基础结构来表示带符号整数(如一的补码)的底层架构可能仍然存在于某些地方。编译器不能假设溢出是如何在硬件上处理的。
2. 后来的编译器就会做出假设,例如两个正整数的和也必须是正数,以生成优化的机器代码。
因此,如果 Rust 编译器执行与 C/C++ 编译器相同类型的关于有符号整数的优化,为什么 《Rustonomicon》书中会说:
“无论如何,安全的 Rust 都不会导致未定义行为。”
即使 Rust 编译器不执行这种优化,Rust 程序员仍然不预期看到带符号整数的包装。这难道不能被称为 “未定义行为” 吗?
据我所知,C/C++将有符号整数溢出视为未定义行为的部分原因是:
1. 在 C 标准化时期,使用不同基础结构来表示带符号整数(如一的补码)的底层架构可能仍然存在于某些地方。编译器不能假设溢出是如何在硬件上处理的。
2. 后来的编译器就会做出假设,例如两个正整数的和也必须是正数,以生成优化的机器代码。
因此,如果 Rust 编译器执行与 C/C++ 编译器相同类型的关于有符号整数的优化,为什么 《Rustonomicon》书中会说:
“无论如何,安全的 Rust 都不会导致未定义行为。”
即使 Rust 编译器不执行这种优化,Rust 程序员仍然不预期看到带符号整数的包装。这难道不能被称为 “未定义行为” 吗?