Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当给定脚本出现语法错误时,luaL_dostring()崩溃_Lua - Fatal编程技术网

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

当给定脚本出现语法错误时,luaL_dostring()崩溃,lua,Lua,我尝试在Cortex-M4上使用GCC将Lua集成到嵌入式项目中。我能够加载并运行Lua脚本,从C调用Lua函数,从Lua调用C函数。但是,当luaL_dostring()中作为参数传递的给定脚本包含任何Lua语法错误时,C程序崩溃(HardFault_Handler陷阱上升) 以下是由于Lua中的语法错误而崩溃的相关C代码: //create Lua VM... luaVm = lua_newstate(luaAlloc, NULL); //load li

我尝试在Cortex-M4上使用GCC将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,但我仍然有崩溃:-(


一定有其他原因???

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

//#define LUA_NUMBER_FMT     "%.14g"
#define LUA_NUMBER_FMT     "%d" 
一定还有别的原因

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

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


如果您的C编译器没有为C标准库提供适当的支持,那么Lua将无法在该环境中正常运行。您可以尝试LuaJIT,但我怀疑这会更好。

您的平台是否支持
longjmp
?此程序在运行时是否崩溃:
错误“boom”
?该平台是ST microelectronics的STM32F4。它似乎支持longjmp(比方说:它在使用这些函数时进行编译)。但事实上,Lua在运行错误“foo”时崩溃。所以似乎longjmp不能正常工作???在我看来,
longjmp
是第一件要看的东西。我用
setjmp/longjmp
在我的平台上跳出一个函数进行了一些简单的测试,它可以正常工作。我同意。我的目标不是禁用Lua错误处理。我只是暂时禁用了它,以隔离错误原因。