5

我的情况是我正在使用 Lua (C) API 来执行保存在字符串中的脚本。我希望用户能够终止脚本的执行(如果脚本包含无限循环,这是必不可少的),我该怎么做?

lua_State *Lua = lua_open();
char * code;
// Initialisation code
luaL_dostring(L, code);
4

2 回答 2

9

钩住线是不够的。这段代码只有一行,但会永远循环:

    while true do end

您需要设置指令计数挂钩。如果我没记错的话,那就是

    lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS);

您要选择 NUM_INSTRUCTIONS 使其不会太小(否则会导致性能开销)且不会太大(否则会等待太久直到停止)。

有关仅 Lua 的相关实现,请参阅此库

如果您想为不受信任的 Lua 代码添加更多保护,请在谷歌上搜索“Lua 沙盒”——它不仅仅是无限循环预防。

于 2009-05-14T22:49:45.877 回答
7

每次 lua 执行一行脚本时,您都可以使用挂钩回调到 C。在这个钩子函数中,你可以检查用户是否想退出,如果他们想退出,就调用 lua_error。

static bool ms_quit = false;

void IWantToQuit()
{
    ms_quit = true;
}

void LineHookFunc(lua_State *L, lua_Debug *ar)
{
    if(ar.event == LUA_HOOKLINE)
        if(ms_quit == true)
            luaL_error(L, "Too Many Lines Error");
}
//...

lua_State *Lua = lua_open();
char * code;
// Initialisation code
lua_sethook(Lua, &LineHookFunc, LUA_MASKLINE, 0);
luaL_dostring(L, code);
于 2009-05-14T10:40:40.670 回答