123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- # include "setjmp.h"
- # include <stdio.h>
- # ifndef NOSIGNAL
- # include <signal.h>
- #endif /* not NOSIGNAL */
- /*
- * setjmptest
- * A program to test setjmp(III) and longjmp,
- * in particular with respect to register variables
- */
- int whichtest;
- int nerrors;
- main() {
- jmp_buf envm;
- register int i;
- test1();
- test2();
- test3();
- test4();
- test5();
- test6();
- if (nerrors) return nerrors;
- i = 1;
- if (setjmp(envm) == 0) {
- i = 2;
- longjmp(envm, 1);
- }
- else {
- if (i == 2) {
- printf("Setjmp/longjmp work ok, even with register variables\n");
- }
- else if (i == 1) {
- printf("WARNING: The setjmp/longjmp of this machine restore register variables\n\
- to the value they had at the time of the \"setjmp\"\n");
- }
- else {
- printf("Aha, I just found one last error\n");
- return 1;
- }
- }
- return 0;
- }
- e(n) {
- nerrors++;
- fprintf(stderr,"Error %d in test %d\n",n,whichtest);
- }
- test1() {
- register p;
- printf("TEST 1 : one integer register variable\n");
- whichtest = 1;
- p = 200;
- garbage();
- if (p != 200) e(1);
- }
- test2() {
- register p,q;
- printf("TEST 2 : two integer register variables\n");
- whichtest = 2;
- p = 200; q = 300;
- garbage();
- if (p != 200) e(1);
- if (q != 300) e(2);
- }
-
- test3() {
- register p,q,r;
- printf("TEST 3 : three integer register variables\n");
- whichtest = 3;
- p = 200; q = 300; r = 400;
- garbage();
- if (p != 200) e(1);
- if (q != 300) e(2);
- if (r != 400) e(3);
- }
-
- char buf[512];
- test4() {
- register char *p;
- printf("TEST 4 : one pointer register variable\n");
- whichtest = 4;
- p = &buf[100];
- garbage();
- if (p != &buf[100]) e(1);
- }
- test5() {
- register char *p,*q;
- printf("TEST 5 : two pointer register variables\n");
- whichtest = 5;
- p = &buf[100]; q = &buf[200];
- garbage();
- if (p != &buf[100]) e(1);
- if (q != &buf[200]) e(2);
- }
- test6() {
- register char *p,*q,*r;
- printf("TEST 6 : three pointer register variables\n");
- whichtest = 6;
- p = &buf[100]; q = &buf[200]; r = &buf[300];
- garbage();
- if (p != &buf[100]) e(1);
- if (q != &buf[200]) e(2);
- if (r != &buf[300]) e(3);
- }
- jmp_buf env;
- /* return address of local variable.
- This way we can check that the stack is not polluted.
- */
- char *
- addr() {
- char a;
- return &a;
- }
- garbage() {
- register i,j,k;
- register char *p,*q,*r;
- char *a, *tmp;
- int t;
- p = &buf[300];
- q = &buf[400];
- r = &buf[500];
- i = 10; j = 20; k = 30;
- switch(setjmp(env)) {
- case 0:
- a = addr();
- longjmp(env,1);
- break;
- case 1:
- if (i != 10) e(11);
- if (j != 20) e(12);
- if (k != 30) e(13);
- if (p != &buf[300]) e(14);
- if (q != &buf[400]) e(15);
- if (r != &buf[500]) e(16);
- tmp = addr();
- if (a != tmp) e(17);
- level1();
- break;
- case 2:
- if (i != 10) e(21);
- if (j != 20) e(22);
- if (k != 30) e(23);
- if (p != &buf[300]) e(24);
- if (q != &buf[400]) e(25);
- if (r != &buf[500]) e(26);
- if (a != tmp) e(27);
- level2();
- break;
- case 3:
- if (i != 10) e(31);
- if (j != 20) e(32);
- if (k != 30) e(33);
- if (p != &buf[300]) e(34);
- if (q != &buf[400]) e(35);
- if (r != &buf[500]) e(36);
- if (a != tmp) e(37);
- # ifndef NOSIGNAL
- hard();
- case 4:
- if (i != 10) e(41);
- if (j != 20) e(42);
- if (k != 30) e(43);
- if (p != &buf[300]) e(44);
- if (q != &buf[400]) e(45);
- if (r != &buf[500]) e(46);
- if (a != tmp) e(47);
- #endif
- return;
- break;
- default:
- e(100);
- }
- e(200);
- }
- level1() {
- register char *p;
- register i;
- i = 1000;
- p = &buf[10];
- i = 200;
- p = &buf[20];
- longjmp(env,2);
- }
- level2() {
- register char *p;
- register i;
- i = 0200;
- p = &buf[2];
- *p = i;
- dolev();
- }
- dolev() {
- register char *p;
- register i;
- i = 010;
- p = &buf[3];
- *p = i;
- longjmp(env,3);
- }
- # ifndef NOSIGNAL
- catch() {
- printf(" signal caught\n");
- longjmp(env,4);
- }
- hard() {
- register char *p;
- signal(SIGHUP,catch);
- for(p = buf;p <= &buf[511]; p++) *p = 025;
- printf("Sending signal ...");
- kill(getpid(),SIGHUP);
- }
- #endif /* not NOSIGNAL */
|