当给定的脚本有语法错误时,luaL_dostring()崩溃

时间:2012-03-15 22:12:09

标签: lua

我尝试将Lua集成到使用Cortex-M4上的GCC的嵌入式项目中。我能够加载并运行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,但我仍然遇到了崩溃: - (

必须有另一个原因???

2 个答案:

答案 0 :(得分:1)

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

//#define LUA_NUMBER_FMT     "%.14g"
#define LUA_NUMBER_FMT     "%d" 

答案 1 :(得分:0)

  

必须有另一个原因???

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

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

如果您的C编译器没有为C标准库提供适当的支持,那么Lua就不会在该环境中起作用。你可以试试LuaJIT,但我怀疑那会更好。