aboutsummaryrefslogtreecommitdiff
path: root/testes/cstack.lua
diff options
context:
space:
mode:
Diffstat (limited to 'testes/cstack.lua')
-rw-r--r--testes/cstack.lua17
1 files changed, 12 insertions, 5 deletions
diff --git a/testes/cstack.lua b/testes/cstack.lua
index 486abc1d..cd74fd28 100644
--- a/testes/cstack.lua
+++ b/testes/cstack.lua
@@ -4,7 +4,7 @@
4local debug = require "debug" 4local debug = require "debug"
5 5
6print"testing C-stack overflow detection" 6print"testing C-stack overflow detection"
7print"If this test craches, see its file ('cstack.lua')" 7print"If this test crashes, see its file ('cstack.lua')"
8 8
9-- Segmentation faults in these tests probably result from a C-stack 9-- Segmentation faults in these tests probably result from a C-stack
10-- overflow. To avoid these errors, you can use the function 10-- overflow. To avoid these errors, you can use the function
@@ -19,10 +19,13 @@ print"If this test craches, see its file ('cstack.lua')"
19-- higher than 2_000. 19-- higher than 2_000.
20 20
21 21
22-- get and print original limit
22local origlimit = debug.setcstacklimit(400) 23local origlimit = debug.setcstacklimit(400)
23print("default stack limit: " .. origlimit) 24print("default stack limit: " .. origlimit)
24 25
25-- change this value for different limits for this test suite 26-- Do the tests using the original limit. Or else you may want to change
27-- 'currentlimit' to lower values to avoid a seg. fault or to higher
28-- values to check whether they are reliable.
26local currentlimit = origlimit 29local currentlimit = origlimit
27debug.setcstacklimit(currentlimit) 30debug.setcstacklimit(currentlimit)
28print("current stack limit: " .. currentlimit) 31print("current stack limit: " .. currentlimit)
@@ -33,12 +36,14 @@ local function checkerror (msg, f, ...)
33 assert(not s and string.find(err, msg)) 36 assert(not s and string.find(err, msg))
34end 37end
35 38
39-- auxiliary function to keep 'count' on the screen even if the program
40-- crashes.
36local count 41local count
37local back = string.rep("\b", 8) 42local back = string.rep("\b", 8)
38local function progress () 43local function progress ()
39 count = count + 1 44 count = count + 1
40 local n = string.format("%-8d", count) 45 local n = string.format("%-8d", count)
41 io.stderr:write(back, n) 46 io.stderr:write(back, n) -- erase previous value and write new one
42end 47end
43 48
44 49
@@ -46,7 +51,7 @@ do print("testing simple recursion:")
46 count = 0 51 count = 0
47 local function foo () 52 local function foo ()
48 progress() 53 progress()
49 foo() 54 foo() -- do recursive calls until a stack error (or crash)
50 end 55 end
51 checkerror("stack overflow", foo) 56 checkerror("stack overflow", foo)
52 print("\tfinal count: ", count) 57 print("\tfinal count: ", count)
@@ -118,9 +123,11 @@ do print("testing changes in C-stack limit")
118 return n 123 return n
119 end 124 end
120 125
126 -- set limit to 400
121 assert(debug.setcstacklimit(400) == currentlimit) 127 assert(debug.setcstacklimit(400) == currentlimit)
122 local lim400 = check() 128 local lim400 = check()
123 -- a very low limit (given that the several calls to arive here) 129 -- set a very low limit (given that there are already several active
130 -- calls to arrive here)
124 local lowlimit = 38 131 local lowlimit = 38
125 assert(debug.setcstacklimit(lowlimit) == 400) 132 assert(debug.setcstacklimit(lowlimit) == 400)
126 assert(check() < lowlimit - 30) 133 assert(check() < lowlimit - 30)