Я работаю над встроенной системой с 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;
}