Use do_run_from_file() for test_longjmp_stacked
This commit is contained in:
Родитель
c5b55a9f04
Коммит
04955bb9f5
|
@ -0,0 +1,44 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int bottom, top;
|
||||
|
||||
int run(int y) {
|
||||
// confuse stack
|
||||
char *s = (char*)alloca(100);
|
||||
memset(s, 1, 100);
|
||||
s[y] = y;
|
||||
s[y/2] = y*2;
|
||||
volatile int x = s[y];
|
||||
top = (int)alloca(4);
|
||||
if (x <= 2) return x;
|
||||
jmp_buf buf;
|
||||
printf("setjmp of %d\n", x);
|
||||
if (setjmp(buf) == 0) {
|
||||
printf("going\n");
|
||||
x += run(x/2);
|
||||
longjmp(buf, 1);
|
||||
}
|
||||
printf("back\n");
|
||||
return x/2;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int sum = 0;
|
||||
for (int i = 0; i < argc*2; i++) {
|
||||
bottom = (int)alloca(4);
|
||||
sum += run(10);
|
||||
// scorch the earth
|
||||
if (bottom < top) {
|
||||
memset((void*)bottom, 1, top - bottom);
|
||||
} else {
|
||||
memset((void*)top, 1, bottom - top);
|
||||
}
|
||||
}
|
||||
printf("%d\n", sum);
|
||||
return sum;
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
setjmp of 10
|
||||
going
|
||||
setjmp of 5
|
||||
going
|
||||
back
|
||||
back
|
||||
setjmp of 10
|
||||
going
|
||||
setjmp of 5
|
||||
going
|
||||
back
|
||||
back
|
||||
12
|
|
@ -1124,64 +1124,11 @@ class T(RunnerCore): # Short name, to make it more fun to use manually on the co
|
|||
self.do_run_from_file(src, output)
|
||||
|
||||
def test_longjmp_stacked(self):
|
||||
src = r'''
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
test_path = path_from_root('tests', 'core', 'test_longjmp_stacked')
|
||||
src, output = (test_path + s for s in ('.in', '.out'))
|
||||
|
||||
int bottom, top;
|
||||
self.do_run_from_file(src, output)
|
||||
|
||||
int run(int y) {
|
||||
// confuse stack
|
||||
char *s = (char*)alloca(100);
|
||||
memset(s, 1, 100);
|
||||
s[y] = y;
|
||||
s[y/2] = y*2;
|
||||
volatile int x = s[y];
|
||||
top = (int)alloca(4);
|
||||
if (x <= 2) return x;
|
||||
jmp_buf buf;
|
||||
printf("setjmp of %d\n", x);
|
||||
if (setjmp(buf) == 0) {
|
||||
printf("going\n");
|
||||
x += run(x/2);
|
||||
longjmp(buf, 1);
|
||||
}
|
||||
printf("back\n");
|
||||
return x/2;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int sum = 0;
|
||||
for (int i = 0; i < argc*2; i++) {
|
||||
bottom = (int)alloca(4);
|
||||
sum += run(10);
|
||||
// scorch the earth
|
||||
if (bottom < top) {
|
||||
memset((void*)bottom, 1, top - bottom);
|
||||
} else {
|
||||
memset((void*)top, 1, bottom - top);
|
||||
}
|
||||
}
|
||||
printf("%d\n", sum);
|
||||
return sum;
|
||||
}
|
||||
'''
|
||||
self.do_run(src, '''setjmp of 10
|
||||
going
|
||||
setjmp of 5
|
||||
going
|
||||
back
|
||||
back
|
||||
setjmp of 10
|
||||
going
|
||||
setjmp of 5
|
||||
going
|
||||
back
|
||||
back
|
||||
12
|
||||
''')
|
||||
|
||||
def test_longjmp_exc(self):
|
||||
src = r'''
|
||||
|
|
Загрузка…
Ссылка в новой задаче