C语言 当发生 Lua 错误时,使用 MINGW32 编译的 Lua 5.2 会使我的主机程序崩溃



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

我通过在测试脚本中犯 Lua 语法错误来检测到此错误。如果脚本完全没有错误,则主机程序成功运行它。但是,当加载无效脚本(例如,在IF块中缺少THEN)时,主机程序崩溃了。

这是我的代码片段:

//Load the script    
int status = luaL_loadfile(L, "foo.lua");
if (status == 0) {
    //Run the script
    ....
} else {
    warn("LUA script error: %d. %s", status, lua_tostring(L, -1));       
    lua_pop(L, 1);
}    

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

问题出在 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来覆盖此设置。

希望这有帮助。

最新更新