Use do_run_from_file() for test_longjmp_stacked

This commit is contained in:
Vasilis Kalintiris 2013-12-07 11:23:49 +02:00
Родитель c5b55a9f04
Коммит 04955bb9f5
3 изменённых файлов: 60 добавлений и 56 удалений

Просмотреть файл

@ -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'''