Lua 5.2 编译使用 MINGW32,在 Lua 出现错误时会使我的宿主程序崩溃。

使用MINGW32编译Lua 5.2会创建一个库(lua52.dll),当Lua错误发生时,它可能会导致主机应用程序崩溃。

我通过在测试脚本中制造Lua语法错误来检测到这个bug。如果脚本没有任何错误,主机程序就可以成功运行它。然而,当加载无效脚本时(如在IF块中丢失THEN),主机程序会崩溃。

这是我的代码片段:

//加载脚本
int status = luaL_loadfile(L, "foo.lua");
if (status == 0) {
    //运行脚本
    ....
} else {
    warn("LUA script error: %d. %s", status, lua_tostring(L, -1));
    lua_pop(L, 1);
}

如果脚本没有语法错误,status为0,脚本将被成功执行。否则,luaL_loadfile不返回并且程序崩溃。

点赞
用户1570711
用户1570711

问题在于 Lua 的 Makefile 中指定的 CFLAGS。原来,src/Makefile 包含以下行:

CFLAGS= -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS)

问题通过将其更改为以下内容得到解决:

CFLAGS= -O2 -fno-omit-frame-pointer -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS)

解释

Lua 的错误处理基于使用函数 setjmplongjmp-O2 优化标志隐式地使编译器省略帧指针。为了避免这种情况,我们传递 -fno-omit-frame-pointer 来覆盖此设置。

希望这可以帮到你。

2013-11-11 10:13:50