在简单的整数除法过程中出现"内存分配错误:块太大"的问题

我有一个奇怪的问题。在STM32F429上编译的LUA 5.3.5中,可用内存约为1Mb(内存分配使用外部SDRAM,而不是STM32上更有限的内部RAM)。需要注意的是,像字符串这样的操作完全没问题。只有除法似乎会出现问题。

以下脚本可以正常运行:

a=100
b=20
c=a+b
print(c)

以下脚本返回"内存分配错误:块太大:"

a=100
b=20
c=a/b
print(c)

进一步研究表明,问题不在除法上。而是在print()调用的tostring()上。由于直接除法的结果,tostring()试图分配过多的内存。

在lstring.c中,是这样的:

   luaS_newlstr():
   if (l >= (MAX_SIZE - sizeof(TString))/sizeof(char))
      luaM_toobig(L);

当发生问题时,l == 0xd0600f56 (有趣的是,这是一个在外部SDRAM范围内的内存地址位置,而不是有效的字符串大小)。

如果我修改LUA脚本如下,则正常运行:

a=100
b=20
c=math.floor(a/b)
print(c)

我检查了两种情况下的c,类型都为number

至于内存分配的问题,我们在LUA启动期间使用了dlmalloc()库进行配置,如下所示:

  ezCmdLua = lua_newstate(ezlua_poolalloc, NULL);
  int error = luaL_loadbuffer(ezCmdLua, bfr, len, "ezCmdLua");
  if (!error)
  {
    error = lua_pcall(ezCmdLua, 0, 0, 0);
    if (error) {
...
    }
  }

....

static void *ezlua_poolalloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  (void)ud; (void)osize;  /* not used */
  if (nsize == 0) {
    dlfree(ptr);
    return NULL;
  }
  else
    return dlrealloc(ptr, nsize);
}

我已确认内存分配正常工作,可以进行字符串操作和打印字符串,完全没有问题。实际上,在调试此问题时,luaS_newlstr()函数在问题发生之前被多次调用,每次l的长度(字符串长度)都是一个合理的值。但是,当我尝试打印除法的结果时,情况就不同了。在脚本中移动除法不会有任何影响(例如,在除法之前添加其他打印语句),因此我怀疑堆栈被破坏了。

点赞