stjmp.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. # include "setjmp.h"
  2. # include <stdio.h>
  3. # ifndef NOSIGNAL
  4. # include <signal.h>
  5. #endif /* not NOSIGNAL */
  6. /*
  7. * setjmptest
  8. * A program to test setjmp(III) and longjmp,
  9. * in particular with respect to register variables
  10. */
  11. int whichtest;
  12. int nerrors;
  13. main() {
  14. jmp_buf envm;
  15. register int i;
  16. test1();
  17. test2();
  18. test3();
  19. test4();
  20. test5();
  21. test6();
  22. if (nerrors) return nerrors;
  23. i = 1;
  24. if (setjmp(envm) == 0) {
  25. i = 2;
  26. longjmp(envm, 1);
  27. }
  28. else {
  29. if (i == 2) {
  30. printf("Setjmp/longjmp work ok, even with register variables\n");
  31. }
  32. else if (i == 1) {
  33. printf("WARNING: The setjmp/longjmp of this machine restore register variables\n\
  34. to the value they had at the time of the \"setjmp\"\n");
  35. }
  36. else {
  37. printf("Aha, I just found one last error\n");
  38. return 1;
  39. }
  40. }
  41. return 0;
  42. }
  43. e(n) {
  44. nerrors++;
  45. fprintf(stderr,"Error %d in test %d\n",n,whichtest);
  46. }
  47. test1() {
  48. register p;
  49. printf("TEST 1 : one integer register variable\n");
  50. whichtest = 1;
  51. p = 200;
  52. garbage();
  53. if (p != 200) e(1);
  54. }
  55. test2() {
  56. register p,q;
  57. printf("TEST 2 : two integer register variables\n");
  58. whichtest = 2;
  59. p = 200; q = 300;
  60. garbage();
  61. if (p != 200) e(1);
  62. if (q != 300) e(2);
  63. }
  64. test3() {
  65. register p,q,r;
  66. printf("TEST 3 : three integer register variables\n");
  67. whichtest = 3;
  68. p = 200; q = 300; r = 400;
  69. garbage();
  70. if (p != 200) e(1);
  71. if (q != 300) e(2);
  72. if (r != 400) e(3);
  73. }
  74. char buf[512];
  75. test4() {
  76. register char *p;
  77. printf("TEST 4 : one pointer register variable\n");
  78. whichtest = 4;
  79. p = &buf[100];
  80. garbage();
  81. if (p != &buf[100]) e(1);
  82. }
  83. test5() {
  84. register char *p,*q;
  85. printf("TEST 5 : two pointer register variables\n");
  86. whichtest = 5;
  87. p = &buf[100]; q = &buf[200];
  88. garbage();
  89. if (p != &buf[100]) e(1);
  90. if (q != &buf[200]) e(2);
  91. }
  92. test6() {
  93. register char *p,*q,*r;
  94. printf("TEST 6 : three pointer register variables\n");
  95. whichtest = 6;
  96. p = &buf[100]; q = &buf[200]; r = &buf[300];
  97. garbage();
  98. if (p != &buf[100]) e(1);
  99. if (q != &buf[200]) e(2);
  100. if (r != &buf[300]) e(3);
  101. }
  102. jmp_buf env;
  103. /* return address of local variable.
  104. This way we can check that the stack is not polluted.
  105. */
  106. char *
  107. addr() {
  108. char a;
  109. return &a;
  110. }
  111. garbage() {
  112. register i,j,k;
  113. register char *p,*q,*r;
  114. char *a, *tmp;
  115. int t;
  116. p = &buf[300];
  117. q = &buf[400];
  118. r = &buf[500];
  119. i = 10; j = 20; k = 30;
  120. switch(setjmp(env)) {
  121. case 0:
  122. a = addr();
  123. longjmp(env,1);
  124. break;
  125. case 1:
  126. if (i != 10) e(11);
  127. if (j != 20) e(12);
  128. if (k != 30) e(13);
  129. if (p != &buf[300]) e(14);
  130. if (q != &buf[400]) e(15);
  131. if (r != &buf[500]) e(16);
  132. tmp = addr();
  133. if (a != tmp) e(17);
  134. level1();
  135. break;
  136. case 2:
  137. if (i != 10) e(21);
  138. if (j != 20) e(22);
  139. if (k != 30) e(23);
  140. if (p != &buf[300]) e(24);
  141. if (q != &buf[400]) e(25);
  142. if (r != &buf[500]) e(26);
  143. if (a != tmp) e(27);
  144. level2();
  145. break;
  146. case 3:
  147. if (i != 10) e(31);
  148. if (j != 20) e(32);
  149. if (k != 30) e(33);
  150. if (p != &buf[300]) e(34);
  151. if (q != &buf[400]) e(35);
  152. if (r != &buf[500]) e(36);
  153. if (a != tmp) e(37);
  154. # ifndef NOSIGNAL
  155. hard();
  156. case 4:
  157. if (i != 10) e(41);
  158. if (j != 20) e(42);
  159. if (k != 30) e(43);
  160. if (p != &buf[300]) e(44);
  161. if (q != &buf[400]) e(45);
  162. if (r != &buf[500]) e(46);
  163. if (a != tmp) e(47);
  164. #endif
  165. return;
  166. break;
  167. default:
  168. e(100);
  169. }
  170. e(200);
  171. }
  172. level1() {
  173. register char *p;
  174. register i;
  175. i = 1000;
  176. p = &buf[10];
  177. i = 200;
  178. p = &buf[20];
  179. longjmp(env,2);
  180. }
  181. level2() {
  182. register char *p;
  183. register i;
  184. i = 0200;
  185. p = &buf[2];
  186. *p = i;
  187. dolev();
  188. }
  189. dolev() {
  190. register char *p;
  191. register i;
  192. i = 010;
  193. p = &buf[3];
  194. *p = i;
  195. longjmp(env,3);
  196. }
  197. # ifndef NOSIGNAL
  198. catch() {
  199. printf(" signal caught\n");
  200. longjmp(env,4);
  201. }
  202. hard() {
  203. register char *p;
  204. signal(SIGHUP,catch);
  205. for(p = buf;p <= &buf[511]; p++) *p = 025;
  206. printf("Sending signal ...");
  207. kill(getpid(),SIGHUP);
  208. }
  209. #endif /* not NOSIGNAL */