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

问题描述 投票:2回答:1

Rust在调试和释放模式下以不同的方式对待有符号整数溢出。发生这种情况时,Rust会在调试模式下惊慌失措,而在发布模式下会默默地执行补码换行。

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

  1. 在C标准化的时候,表示带符号整数的不同基础架构(例如补码)可能仍在使用。编译器无法假设硬件中如何处理溢出。
  2. 后来的编译器因此假设诸如两个正整数之和也必须为正,才能生成优化的机器代码。
  3. 因此,如果Rust编译器确实执行与C / C ++编译器相同的关于有符号整数的优化,为什么The Rustonomicon

指出:

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

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

Rust在调试和释放模式下以不同的方式对待有符号整数溢出。发生这种情况时,Rust会在调试模式下惊慌失措,而在释放模式下会默默执行二进制补码换行。据我...

rust integer-overflow llvm-codegen
1个回答
4
投票

Q:

© www.soinside.com 2019 - 2024. All rights reserved.