3

使用 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不返回并且程序崩溃。

4

1 回答 1

3

问题出CFLAGS在 Lua 的 Makefile 中指定。最初,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-11T10:13:50.200 回答