当 Lua 脚本存在语法错误时,调用 luaL_dostring() 会崩溃。

我尝试使用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用户1272657
stackoverflow用户1272657

我发现了问题:是在 Lua 语法错误上调用了 sprintf 函数。实际上,在我的平台上,sprintf 似乎不支持浮点数格式。因此我将 luaconf.h 以如下方式更改,将格式限制为整数格式。

//#define LUA_NUMBER_FMT     "%.14g"
#define LUA_NUMBER_FMT     "%d"
2012-03-17 22:53:03
stackoverflow用户734069
stackoverflow用户734069

必须有其他原因吧???

是的:你不能在这里使用 Lua。

Lua 的错误处理系统建立在 setjmp/longjump 框架上。你不能让 LUAI_THROWLUAI_TRY 什么都不做。这意味着 lua_error 和所有内部的错误处理都停止工作。语法错误是 Lua 内部错误处理的一部分。

如果你的 C 编译器没有适当的支持 C 标准库,那么 Lua 在那个环境中就不能正常工作。你可以尝试使用 LuaJIT,但我怀疑这也不会更好。

2012-04-03 11:19:16
stackoverflow用户14902625
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