繁体   English   中英

为什么 integer 除以零不会使用 gcc 编译的程序崩溃?

[英]Why integer division by zero doesn't crash the program compiled with gcc?

Integer 除以零是未定义的,应该导致浮点异常,这就是我编写以下代码的原因

 int j = 0 ;
 int x = 1 / j;

在这种情况下,程序只是与 FPE 一起崩溃,但如果我不使用变量,那么 go 将使用像这样的字面值int x = 1 / 0; 该程序不会崩溃,而只是为x分配一些随机值! 我试图检测int x = 1 / 0; 通过添加自定义SIGFPE处理程序确实会导致崩溃,但是正如我认为在文字零除法期间从未调用过的那样,但是当我首先将0存储在变量中时它会发生。 因此,似乎字面上的零除法实际上从未使程序崩溃(我的意思是除法本身永远不会发生),那么在这种情况下,编译器(在我的情况下为 GCC)是否执行任何技巧(例如用随机数替换0 )? 还是我误解了什么?

为什么 integer 除以零不会使用 gcc 编译的程序崩溃?

好吧,我认为答案是:因为它可以。 它可能会崩溃。 它不能崩溃。

还是我误解了什么?

C11 6.5.5p5 (强调我的:p):

/ 运算符的结果是第一个操作数除以第二个操作数的商; % 运算符的结果是余数。 在这两个操作中,如果第二个操作数的值为零,则行为未定义

行为未定义 没有定义应该发生什么。 它可能会“崩溃”。 它不能崩溃。 它可以产生鼻恶魔 该程序可以做任何事情。

您应该只编写您知道它们的行为方式的程序。 如果您希望程序“崩溃”,请调用abort()

那么在这种情况下,编译器(在我的例子中是 GCC)会执行任何技巧(例如用随机数替换 0)吗?

唯一知道的方法是检查生成的汇编代码。 您可以使用https://godbolt.org/

由于表达式包含除以零常数,gcc 可以在编译时处理该问题。

如果除以变量值为 0,编译器会将责任交给异常处理程序,因为评估是不可预测的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM