大佬教程收集整理的这篇文章主要介绍了为什么整数除以零不会使用 gcc 编译的程序崩溃?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
整数除以零是未定义的,应该导致浮点异常,这就是我编写以下代码的原因
int j = 0 ;
int x = 1 / j;
在这种情况下,程序只是使用 FPE 崩溃,但如果我不使用变量并使用这样的文字值 int x = 1 / 0;
程序不会崩溃,但只是将一些随机值分配给 { {1}}!我试图通过添加自定义 x
处理程序来检测 int x = 1 / 0;
是否真的导致崩溃,但我认为它在字面零除期间从未被调用,但是当我将 SIGFPE
存储在变量第一。因此,似乎字面零除法实际上从未使程序崩溃(我的意思是除法本身从未发生过),编译器(在我的情况下为 GCC)执行任何技巧(例如用随机数替换 0
)这个案例?还是我误会了什么?
为什么整数除以零不会使 gcc 编译的程序崩溃?
嗯,我认为答案是:因为它可以。它可能会崩溃。它不会崩溃。
还是我误会了什么?
来自C11 6.5.5p5(强调我的:p):
/ 运算符的结果是第一个操作数除以第二个操作数的商; % 运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为未定义。
The behavior is not defined。没有定义应该发生什么。它可以“崩溃”。它不能崩溃。它可以spawn nasal demons。该程序可以做任何事情。
您应该只编写您知道它们将如何运行的程序。如果您希望您的程序“崩溃”,请调用 Data.RedBlackTree> :t left_legal_prf
impl : Ord k
right : RedBlackTree 0 c_2 k v
p_k : k
p_v : v
k : k
v : v
left : RedBlackTree 0 Black k v
d : Nat
------------------------------
left_legal_prf : LT = compare k p_k
。
在这种情况下,编译器(在我的情况下为 GCC)是否执行任何技巧(例如用随机数替换 0)?
唯一知道的方法是检查生成的汇编代码。您可以使用 https://godbolt.org/
,由于表达式包含除以零常量,gcc 可以在编译时处理这个问题。
如果除以变量值为 0,编译器会将责任交给异常处理程序,因为评估是不可预测的。
以上是大佬教程为你收集整理的为什么整数除以零不会使用 gcc 编译的程序崩溃?全部内容,希望文章能够帮你解决为什么整数除以零不会使用 gcc 编译的程序崩溃?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。