浏览代码

Small changes around C-stack limit

- Better documentation in 'testes/cstack.lua' about using
'debug.setCstacklimit' to find a good limit.

- Constant LUAI_MAXCSTACK gets added CSTACKERR (extra stack for
error handling), so that it is compatible with the argument to
'debug.setCstacklimit'.
Roberto Ierusalimschy 6 年之前
父节点
当前提交
8b7cfee26b
共有 4 个文件被更改,包括 24 次插入10 次删除
  1. 1 1
      lstate.c
  2. 1 1
      ltests.h
  3. 1 1
      luaconf.h
  4. 21 7
      testes/cstack.lua

+ 1 - 1
lstate.c

@@ -388,7 +388,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
   preinit_thread(L, g);
   g->allgc = obj2gco(L);  /* by now, only object is the main thread */
   L->next = NULL;
-  g->Cstacklimit = L->nCcalls = LUAI_MAXCSTACK;
+  g->Cstacklimit = L->nCcalls = LUAI_MAXCSTACK + CSTACKERR;
   g->frealloc = f;
   g->ud = ud;
   g->warnf = NULL;

+ 1 - 1
ltests.h

@@ -31,7 +31,7 @@
 
 /* compiled with -O0, Lua uses a lot of C stack space... */
 #undef LUAI_MAXCSTACK
-#define LUAI_MAXCSTACK	(400 + CSTACKERR)
+#define LUAI_MAXCSTACK		400
 
 /* to avoid warnings, and to make sure value is really unused */
 #define UNUSED(x)       (x=0, (void)(x))

+ 1 - 1
luaconf.h

@@ -47,7 +47,7 @@
 ** (It will crash with a limit too high.)
 */
 #if !defined(LUAI_MAXCSTACK)
-#define LUAI_MAXCSTACK		2200
+#define LUAI_MAXCSTACK		2000
 #endif
 
 

+ 21 - 7
testes/cstack.lua

@@ -4,15 +4,29 @@
 local debug = require "debug"
 
 print"testing C-stack overflow detection"
+print"If this test craches, see its file ('cstack.lua')"
+
+-- Segmentation faults in these tests probably result from a C-stack
+-- overflow. To avoid these errors, you can use the function
+-- 'debug.setCstacklimit' to set a smaller limit for the use of
+-- C stack by Lua. After finding a reliable limit, you might want
+-- to recompile Lua with this limit as the value for
+-- the constant 'LUAI_MAXCCALLS', which defines the default limit.
+-- (The default limit is printed by this test.)
+-- Alternatively, you can ensure a larger stack for the program.
+
+-- For Linux, a limit up to 30_000 seems Ok. Windows cannot go much
+-- higher than 2_000.
+
 
 local origlimit = debug.setCstacklimit(400)
-print("current stack limit: " .. origlimit)
-debug.setCstacklimit(origlimit)
+print("default stack limit: " .. origlimit)
+
+-- change this value for different limits for this test suite
+local currentlimit = origlimit
+debug.setCstacklimit(currentlimit)
+print("current stack limit: " .. currentlimit)
 
--- Segmentation faults in these tests probably result from a C-stack
--- overflow. To avoid these errors, recompile Lua with a smaller
--- value for the constant 'LUAI_MAXCCALLS' or else ensure a larger
--- stack for the program.
 
 local function checkerror (msg, f, ...)
   local s, err = pcall(f, ...)
@@ -104,7 +118,7 @@ do  print("testing changes in C-stack limit")
     return n
   end
 
-  assert(debug.setCstacklimit(400) == origlimit)
+  assert(debug.setCstacklimit(400) == currentlimit)
   local lim400 = check()
   -- a very low limit (given that the several calls to arive here)
   local lowlimit = 38