使用 MINGW32 编译 Lua 5.2 会创建一个库 (lua52.dll),当发生 Lua 错误时,该库可能会使主机应用程序崩溃。
我通过在测试脚本中制造 Lua 语法错误来检测到此错误。如果脚本完全没有错误,则主机程序成功运行了它。但是,当加载无效脚本时(例如,在 IF block 中缺少 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
优化标志隐式地使编译器变为 omit the frame pointer .为避免这种情况,我们通过 -fno-omit-frame-pointer
来覆盖此设置。
希望这对您有所帮助。
关于c - 当发生 Lua 错误时,使用 MINGW32 编译的 Lua 5.2 使我的主机程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19903762/