Lua Crash при создании нового состояния - PullRequest
0 голосов
/ 24 января 2019

Я работаю над встроенной системой с Cortex-M4F с 256 КБ ОЗУ и 1 МБ флэш-памяти.Мое приложение написано на C ++, но я создал и интегрировал Lua как библиотеку C, используя GCC.Мне нужно было только определить l_signalT как 32-разрядное целое число без знака.Мой тестовый код выглядит следующим образом:

#include "lua.hpp"

int main(void)
{
    while (true)
    {
      lua_State * L = luaL_newstate(); 
      luaL_dostring(L, "a = 10 + 5"); 
      lua_getglobal(L, "a"); 
      int i = lua_tointeger(L, -1); 
      printf("%d\n", i); 
      lua_close(L); 
    }
}

Я получаю разыменование нулевого указателя.Увеличение кучи и стека не решило проблему.Также я добавил тест для null в распределитель, который вызывает realloc.Кажется, что-то происходит в коде setjmp / longjump.Мне интересно, есть ли мысли о том, как отладить это дальше.Я добавил несколько комментариев к <-----, которые могут потребовать прокрутки.Это фактически мой дамп стека.

static void setnodevector (lua_State *L, Table *t, unsigned int size) {
  if (size == 0) {  /* no elements to hash part? */
    t->node = cast(Node *, dummynode);  /* use common 'dummynode' */
    t->lsizenode = 0;                                                      <---- t is zero. Write 
                                                                                 does evil.
                                                                                 Hardfault.

static void auxsetnode (lua_State *L, void *ud) {
  AuxsetnodeT *asn = cast(AuxsetnodeT *, ud);
  setnodevector(L, asn->t, asn->nhsize);           <--- Last two values pointed to are zero.
}

<setjmp>
    466A        mov r2, sp
    E8A05FF4    stm r0!, {r2, r4-r12, lr}
    EC808B10    vstmia r0, {d8-d15}          <------ Part of LUAI_TRY called below. Memory location
    2000        movs r0, #0                          of ud is cleared here.
    4770        bx lr

int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
  unsigned short oldnCcalls = L->nCcalls;
  struct lua_longjmp lj;
  lj.status = LUA_OK;
  lj.previous = L->errorJmp;  /* chain new error handler */
  L->errorJmp = &lj;
  LUAI_TRY(L, &lj,                                            <---- Value pointed to by ud is nonzero
    (*f)(L, ud);                                                    but cleared in setjmp.
  );
  L->errorJmp = lj.previous;  /* restore old error handler */
  L->nCcalls = oldnCcalls;
  return lj.status;
}

1 Ответ

0 голосов
/ 25 января 2019

У меня не было макроса, определенного для VFP, который привел к неправильному размеру jmp_buf:

#if defined(__ARM_ARCH_VFP__) || defined(__ARM_ARCH_VFP3_D16__) || 
defined(__ARM_ARCH_VFP3_D32__) || defined(__ARM_ARCH_VFPV4_D16__) || 
defined(__ARM_ARCH_FPV4_SP_D16__) || defined(__ARM_ARCH_FPV5_SP_D16__) || 
defined(__ARM_ARCH_FPV5_D16__)
typedef unsigned long long jmp_buf[14];  // R4-R14, D8-D15
#else
typedef unsigned long jmp_buf[11];  // R4-R14
#endif

Теперь Lua правильно вычисляет и печатает 10 + 5.

enter image description here

...