使用 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的错误处理基于函数的使用setjmp
和longjmp
。-O2
优化标志隐式使编译器省略帧指针。为了避免这种情况,我们传递-fno-omit-frame-pointer
来覆盖此设置。
希望这有帮助。