【发布时间】:2021-03-16 22:26:25
【问题描述】:
以下代码在使用g++ 10.2 编译时打印gcc says: 0 / 0 equals 1:
#include <iostream>
int main() {
int a = 0;
std::cout << "gcc says: 0 / 0 equals " << (a / a) << std::endl;
return 0;
}
- 应该是这样吗? (使用
clang编译并执行它会返回 136 - Erroneous Arithmetic Operation)。 - 这是某种代码优化的结果吗?
- 有没有办法让它成为错误?
编辑:使用-fsanitize=undefined 编译会使g++ 产生运行时错误。感谢@chris。
【问题讨论】:
-
故事的寓意:未定义的行为确实是未定义的行为。 整数除以零在 C++ 中没有定义,因此编译器完全可以假定
a / a始终为1。a为 0 的情况在它眼里不是根本不可能的。 -
将
(a / a)替换为(a ? std::to_string(a / a) : "oopsies")或任何你想要的失败情况。 -
我想
-fsanitize=undefined可以在这里进行更可靠的错误检测。此外,我注意到 Godbolt 链接没有警告选项,这些选项通常擅长防止某些类别的未定义行为。 -
这能回答你的问题吗? c++ division by 0
-
@chris,谢谢,这正是我想要的。