lua堆栈溢出,这是一个bug吗?

时间:2010-05-07 13:39:47

标签: lua stack overflow

前几天,我们的程序崩溃了。我在lua代码中发现了崩溃。所以我检查了lua代码,发现堆栈溢出。

请在函数luaD_precall中查看此代码:

1  if (!cl->isC) {  /* Lua function? prepare its call */
2       CallInfo *ci;
3       StkId st, base;
4       Proto *p = cl->p;
5       luaD_checkstack(L, p->maxstacksize);
6       func = restorestack(L, funcr);
7       if (!p->is_vararg) {  /* no varargs? */
8              base = func + 1;
9              if (L->top > base + p->numparams)
10             L->top = base + p->numparams;
11      }
12      else {  /* vararg function */
13             int nargs = cast_int(L->top - func) - 1;
14             base = adjust_varargs(L, p, nargs);
15             func = restorestack(L, funcr);  /* previous call may change the stack */
16      }
17      ci = inc_ci(L);  /* now `enter' new function */
18      ci->func = func;
19      L->base = ci->base = base;
20      ci->top = L->base + p->maxstacksize;
21      lua_assert(ci->top <= L->stack_last);
22      L->savedpc = p->code;  /* starting point */
23      ci->tailcalls = 0;
24      ci->nresults = nresults;
25      for (st = L->top; st < ci->top; st++)
26             setnilvalue(st);
27      L->top = ci->top;

在我的程序中,p->maxstacksize在第5行之前是79,当前stacksize是51,在调用luaD_checkstack之后,stacksize增长到130。

lua函数使用vararg,因此将运行到第14行。函数adjust_varargs将被调用。

static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
        int i;
        int nfixargs = p->numparams;
       Table *htab = NULL;
       StkId base, fixed;
       for (; actual < nfixargs; ++actual)
           setnilvalue(L->top++);
#if defined(LUA_COMPAT_VARARG)
       if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */
           int nvar = actual - nfixargs;  /* number of extra arguments */
           lua_assert(p->is_vararg & VARARG_HASARG);
           luaC_checkGC(L);
       htab = luaH_new(L, nvar, 1);  /* create `arg' table */

在函数adjust_varargs()中,lua函数使用“arg”,因此将调用luaC_checkGC。在luaC_checkGC中,当前的lua堆栈大小将减少到65! 调用堆栈如下:

luaC_step()
singlestep()
propagatemark()
traversestack()
checkstacksizes()
luaD_reallocstack()

但是p->maxstacksize是79,stacksize还不够...... 当程序运行到第27行时,L->top大于L->stack_last,在下一次操作中,将导致崩溃!

1 个答案:

答案 0 :(得分:0)

  

这是一个错误吗?

它在我看来就像一个bug,但我不是这个级别的Lua内部专家。您似乎有一个非常连贯的解释,所以如果您还可以构建一个简单的应用程序,使错误可以重现,您应该将整个事件作为错误报告发送到lua@bazar2.conectiva.com.br