当 Lua 脚本存在语法错误时,调用 luaL_dostring() 会崩溃。
2012-4-3 11:13:56
收藏:0
阅读:154
评论:3
我尝试使用GCC在Cortex-M4上集成Lua嵌入式项目。我能够加载和运行Lua脚本,在C中调用Lua函数,在Lua中调用C函数。但是,如果作为参数传递给luaL_dostring()的脚本包含任何Lua语法错误,C程序会崩溃(触发HardFault_Handler陷阱)。
以下是由于Lua中语法错误而崩溃的相关C代码:
//create Lua VM...
luaVm = lua_newstate(luaAlloc, NULL);
//load libraries...
luaopen_base(luaVm);
luaopen_math(luaVm);
luaopen_table(luaVm);
luaopen_string(luaVm);
//launch script...
luaL_dostring(luaVm, "function onTick()\n"
" locaal x = 7\n" //syntax error
"end\n"
"\n" );
当使用正确的Lua语法重复执行同样的操作时,则可以工作:
luaL_dostring(luaVm, "function onTick()\n"
" local x = 7\n"
"end\n"
"\n" );
当进行调试并通过luaL_dostring()进行步骤时,我可以按行跟随Lua解析,当到达具有语法错误的行时,C程序就崩溃了。
有谁能帮忙吗?谢谢。
我在以下方式中禁用了Lua源代码中的setjmp/longjmp
:
//#define LUAI_THROW(L,c) longjmp((c)->b, 1) //TODO oli4 orig
//#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } //TODO oli4 orig
#define LUAI_THROW(L,c) while(1) //TODO oli4 special
#define LUAI_TRY(L,c,a) { a } //TODO oli4 special
...因此不再使用setjmp/longjmp,但我仍然崩溃:-(
必须有另一个原因吗?
原文链接 https://stackoverflow.com/questions/9728966
点赞
stackoverflow用户734069
必须有其他原因吧???
是的:你不能在这里使用 Lua。
Lua 的错误处理系统建立在 setjmp/longjump
框架上。你不能让 LUAI_THROW
和 LUAI_TRY
什么都不做。这意味着 lua_error
和所有内部的错误处理都停止工作。语法错误是 Lua 内部错误处理的一部分。
如果你的 C 编译器没有适当的支持 C 标准库,那么 Lua 在那个环境中就不能正常工作。你可以尝试使用 LuaJIT,但我怀疑这也不会更好。
2012-04-03 11:19:16
stackoverflow用户14902625
#define LUAI_THROW(L,c) c->throwed = true
#define LUAI_TRY(L,c,a) \
__try { a } __except(filter()) { if ((c)->status == 0 && ((c)->throwed)) (c)->status = -1; }
#define luai_jmpbuf int /* dummy variable */
struct lua_longjmp {
struct lua_longjmp *previous;
luai_jmpbuf b;
volatile int status; /* error code */
bool throwed;
};
即使没有使用 C++ 异常,也可以按预期工作。
2021-11-25 21:36:43
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我发现了问题:是在 Lua 语法错误上调用了 sprintf 函数。实际上,在我的平台上,sprintf 似乎不支持浮点数格式。因此我将 luaconf.h 以如下方式更改,将格式限制为整数格式。
//#define LUA_NUMBER_FMT "%.14g" #define LUA_NUMBER_FMT "%d"