gpt4 book ai didi

c# - 防止 Lua 死循环

转载 作者:可可西里 更新时间:2023-11-01 09:10:18 43 4
gpt4 key购买 nike

我使用 lua 接口(interface)在我的 C# 程序中获得 lua 支持,如果用户提交这样的代码,工作线程将卡住

while true do end

我有一种方法可以检测无限循环是否正在运行,但我需要一种从工作线程退出 DoString 方法的好方法。有什么想法吗?

编辑:@kikito,是的,我正在检测类似的东西。我遇到的问题是我找不到一种干净的方法来终止 DoString 方法,看起来 Lua 接口(interface)主类 (Lua) 有一些静态依赖性,因为如果我这样做 lua.Close(); 在我的实例中,它会中止 DoString 方法,但下次我实例化一个 lua 类时 new Lua(); 它会崩溃,说一些关于保护内存的事情

编辑:显示我的 .Close 代码的功能分支 https://github.com/AndersMalmgren/FreePIE/tree/detect-and-recover-infite-lua-loop

最佳答案

Lua 沙盒

设置 Hook 根本不足以防止无意识的资源浪费,更不用说滥用了——这是一个简单的例子(时间花在了字符串模式匹配上——没有调试 Hook 被调用):

s=('a'):rep(20000):match('.-b')

对一段 Lua 代码施加时间/内存限制的唯一可靠方法是在它自己的进程中运行 Lua 解释器,并让您的操作系统监视该进程。

Lua 的好处是您不需要任何复杂的、依赖于操作系统的沙盒权限设置:您只需限制时间和内存(合理;在 Windows 上有 Job Objects ,Unix 有 ulimits- 相关的:Linux resource limitation )和然后让 os.execute、一半的 io-library 和 luasocket 等模块远离脚本编写器(非常简单)。

从沙盒代码中的错误中恢复

你几乎可以处理所有事情(除了违反时间/内存限制)而不会破坏你的 Lua 解释器:只需将用户提供的代码的执行包装在 pcall 中;如果您自己调用任何可能会失败的 Lua-API 函数,您需要将它们包装在一个您也可以 pcall 的函数中(或者设置一个 Lua panic 函数并从那里处理它)。


[我不希望看到这个线程的人认为 debug.sethook 足以用于沙盒,而 stackoverflow 不让我评论(还)]

关于c# - 防止 Lua 死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10352092/

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