关于lua源代码中的EXTRA_STACK宏

EXTRA_STACK是给栈额外预留的空间:

c 复制代码
/* extra stack space to handle TM calls and some other extras */
#define EXTRA_STACK 5

这样top之上的几个位置就可以先用,后面再增加栈空间:

c 复制代码
static void callTM (lua_State *L, const TValue *f, const TValue *p1,
                    const TValue *p2, const TValue *p3) {
  setobj2s(L, L->top, f);  /* push function */
  setobj2s(L, L->top+1, p1);  /* 1st argument */
  setobj2s(L, L->top+2, p2);  /* 2nd argument */
  setobj2s(L, L->top+3, p3);  /* 3th argument */
  luaD_checkstack(L, 4);
  L->top += 4;
  luaD_call(L, L->top - 4, 0);
}

我看到这里就想,干嘛不提前luaD_checkstack(L, 4);

c 复制代码
static void callTM (lua_State *L, const TValue *f, const TValue *p1,
                    const TValue *p2, const TValue *p3) {
  setobj2s(L, L->top, f); /* push function */
  setobj2s(L, L->top+1, p1); /* 1st argument */
  setobj2s(L, L->top+2, p2); /* 2nd argument */
  setobj2s(L, L->top+3, p3); /* 3th argument */
  luaD_checkstack(L, 4);
  L->top += 4;
  luaD_call(L, L->top - 4, 0);
}

但是用AddressSanitizer工具测试发现,在执行源码自带的trace-globals.lua时,setobj2s(L, L->top+3, p3);会报使用已free内存。

经过查看代码发现,p3可能是栈上的数据,luaD_checkstack中可能会调用luaD_reallocstack导致p3不可用。

所以luaD_checkstack要放到后面执行。

相关推荐
IMPYLH1 天前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua
avi91111 天前
Lua高级语法-第二篇
lua·游戏开发·编程语言·语法糖
雨中飘荡的记忆1 天前
秒杀系统设计与实现
java·redis·lua
emo了小猫2 天前
Redis 执行 Lua 脚本过程中报错,会发生什么
redis·junit·lua
软件测试雪儿3 天前
高频Postman软件测试面试题
测试工具·lua·postman
12程序猿4 天前
postman调用文件(.xlsm---带宏的excel文件)下载接口成功下载excel文件,浏览器访问下载文件打不开
excel·lua·postman
霜绛4 天前
Unity:lua热更新(三)——Lua语法(续)
unity·游戏引擎·lua
百***35945 天前
【Java EE】Spring请求如何传递参数详解
spring·java-ee·lua
IMPYLH6 天前
Lua 的 pairs 函数
开发语言·笔记·后端·junit·单元测试·lua
这人很懒没留下什么9 天前
SpringBoot2.7.4整合Oauth2
开发语言·lua