从程序中删除异常
Removing exceptions from program
是否有程序转换或编译技术可以消除潜在的运行时异常,例如div被0、浮点溢出/下溢等。我想在[=19]之前处理我的程序中的潜在异常=] 生成它们。此外,我想要一个在 x64 机器代码级别表达的转换。
例如,要消除 CPU 生成 div by 0
的可能性,我可以在调用 div
指令之前检查 divisor 是否为 0,沿以下几行。
cmp rcx 0
jz my_handler //some routine I wrote
div rcx
但是,对于浮点异常,尤其是下溢和上溢,如何实现这种技术还不清楚。溢出检查不会导致溢出本身吗?
我意识到语言支持异常处理,但我的用例需要这样做。
Is it possible to have CPU not even generate the FP exceptions
是的,这是大多数 OSes 的默认情况,其中设置了 x87 控制字和 MXCSR 中的所有掩码位。如果您不确定某些自定义 OS,很容易将它们全部设置在 main()
或其他内容的顶部。
would it suffice to check two cases: 1) divisor is not 0, and 2) divisor and dividend are not -1 and INT_MIN, respectively?
没有。不,DIV 和我DIV 做 128b / 64b => 64b 除法(或 64/32=>32)。如果 RDX 不为零 (DIV) 或使用 RAX 的 CQO 设置 (IDIV),则很容易发生除法错误。
但是,如果您只是像编译器通常那样将它用于 64b / 64b => 64b 除法,那么是的,唯一的例外情况是有限的。
x/0
对于 DIV 和我DIV
LONG_MIN / -1
我DIV
- 如果您从 RAX 设置 RDX,则无法获得大于操作数大小的股息。
Minimum Values to Cause idiv Instruction to Overflow in x86 Assembly
是否有程序转换或编译技术可以消除潜在的运行时异常,例如div被0、浮点溢出/下溢等。我想在[=19]之前处理我的程序中的潜在异常=] 生成它们。此外,我想要一个在 x64 机器代码级别表达的转换。
例如,要消除 CPU 生成 div by 0
的可能性,我可以在调用 div
指令之前检查 divisor 是否为 0,沿以下几行。
cmp rcx 0
jz my_handler //some routine I wrote
div rcx
但是,对于浮点异常,尤其是下溢和上溢,如何实现这种技术还不清楚。溢出检查不会导致溢出本身吗? 我意识到语言支持异常处理,但我的用例需要这样做。
Is it possible to have CPU not even generate the FP exceptions
是的,这是大多数 OSes 的默认情况,其中设置了 x87 控制字和 MXCSR 中的所有掩码位。如果您不确定某些自定义 OS,很容易将它们全部设置在 main()
或其他内容的顶部。
would it suffice to check two cases: 1) divisor is not 0, and 2) divisor and dividend are not -1 and INT_MIN, respectively?
没有。不,DIV 和我DIV 做 128b / 64b => 64b 除法(或 64/32=>32)。如果 RDX 不为零 (DIV) 或使用 RAX 的 CQO 设置 (IDIV),则很容易发生除法错误。
但是,如果您只是像编译器通常那样将它用于 64b / 64b => 64b 除法,那么是的,唯一的例外情况是有限的。
x/0
对于 DIV 和我DIVLONG_MIN / -1
我DIV- 如果您从 RAX 设置 RDX,则无法获得大于操作数大小的股息。
Minimum Values to Cause idiv Instruction to Overflow in x86 Assembly