Я просматривал исходный код Lua.Я выяснил, где VM получает следующую инструкцию.Это первая строка макроса vmfetch
:
#define vmfetch() { \
i = *(ci->u.l.savedpc++); \
if (L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) \
Protect(luaG_traceexec(L)); \
ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \
lua_assert(base == ci->u.l.base); \
lua_assert(base <= L->top && L->top < L->stack + L->stacksize); \
}
Однако мне не удалось найти код в vmfetch
или в luaV_execute проверяет, является ли ci->u.l.savedpc++
действительным адресом.Что мешает Lua случайно выполнить данные по некоторому случайному адресу?