gpt4 book ai didi

haskell - 使用 GHC 编译 Haskell 时如何禁用 <> 异常?

转载 作者:行者123 更新时间:2023-12-02 10:46:28 26 4
gpt4 key购买 nike

如果我的程序进入无限循环,我希望它实际上陷入困境:永远运行、耗尽内存或因堆栈溢出而崩溃。

我不希望它立即退出 <<loop>>错误信息。如何禁用运行时无限循环检测?

最佳答案

这是一个可能有效的可怕黑客。您可以为检测到黑洞循环时创建的非终止异常创建一个假信息表并使其循环。

假设您有一个 Haskell 程序:

-- Loop.hs
foo :: Int
foo = foo
main = print $ foo

如果你编译它:

$ ghc -O2 Loop.hs

并运行它,它会生成一个Loop: <<loop>>错误。

但是,如果您创建一个程序集文件:

# halt_and_catch_fire.s
# version for Linux x86_64 only
.globl base_ControlziExceptionziBase_nonTermination_closure
.section .data
.align 8
base_ControlziExceptionziBase_nonTermination_closure:
.quad loop
.section .text
.align 8
.quad 0
.quad 14 # FUN_STATIC
loop: jmp loop

并使用您的 Haskell 程序编译它(使用适当的链接器标志来忽略重复的定义):

$ ghc -O2 Loop.hs halt_and_catch_fire.s -optl -zmuldefs

然后运行它,它会锁定。

请注意,上述程序集适用于 x86_64 Linux。在任何其他架构(包括 32 位 Linux)上,都需要对其进行修改,因为闭包布局非常依赖于架构。

关于haskell - 使用 GHC 编译 Haskell 时如何禁用 <<loop>> 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com