c - 当发生 Lua 错误时,使用 MINGW32 编译的 Lua 5.2 使我的主机程序崩溃

标签 c lua mingw32

使用 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 的错误处理是基于函数setjmplongjmp 的使用。 -O2 优化标志隐式地使编译器变为 omit the frame pointer .为避免这种情况,我们通过 -fno-omit-frame-pointer 来覆盖此设置。

希望这对您有所帮助。

关于c - 当发生 Lua 错误时,使用 MINGW32 编译的 Lua 5.2 使我的主机程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19903762/

相关文章:

class - lua 类 - 无法设置属性和检索值

c++ - 可移植编程 - Win32 链接失败但与 linux 链接失败

c - 使用 mingw32 对 posix_memalign 的 undefined reference

html - 使用文本中心属性在 ionic 元素中对齐按钮不起作用

c++ - fputc 如何影响文件大小?

java - 保持 Sqlite3 数据库繁忙

c++ - boost 日志链接错误(Cmake Mingw32)

c - 在字符串中输入字符,直到下一个是整数 - C

Lua 错误 - 需要删除的错误参数 #1

lua - 使用 LIMIT 选项调用 ZRANGEBYSCORE 的 Redis EVAL 语法