1 /* Placed in the public domain by Todd C. Miller on April 30, 2002 */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <signal.h>
6 #include <unistd.h>
7
8 void check_oflow(void);
9 void check_div0(int);
10 void timedout(int);
11 void div0_handler(int);
12 __dead void usage(void);
13
14 /*
15 * Check signal(SIGFPE, SIG_IGN) for overflow and divide by zero.
16 */
17 int
main(int argc,char ** argv)18 main(int argc, char **argv)
19 {
20 int ch, oflag, zflag;
21
22 oflag = zflag = 0;
23 while ((ch = getopt(argc, argv, "oz")) != -1) {
24 switch (ch) {
25 case 'o':
26 oflag = 1;
27 break;
28 case 'z':
29 zflag = 1;
30 break;
31 }
32 }
33
34 if (oflag && zflag)
35 usage();
36
37 signal(SIGFPE, div0_handler);
38 signal(SIGALRM, timedout);
39
40 if (oflag)
41 check_oflow();
42 else
43 check_div0(0);
44
45 exit(0);
46 }
47
48 void
check_oflow(void)49 check_oflow(void)
50 {
51 double d, od;
52
53 od = 0;
54 d = 256;
55 do {
56 od = d;
57 alarm(10);
58 d *= d;
59 alarm(0);
60 } while (d != od);
61 }
62
63 void
check_div0(int zero)64 check_div0(int zero)
65 {
66 int i;
67
68 alarm(10);
69 i = 1 / zero;
70 alarm(0);
71 }
72
73 void
timedout(int sig)74 timedout(int sig)
75 {
76 _exit(1);
77 }
78
79 void
div0_handler(int sig)80 div0_handler(int sig)
81 {
82 _exit(0);
83 }
84
85 __dead void
usage(void)86 usage(void)
87 {
88 extern char *__progname;
89
90 (void)fprintf(stderr, "usage: %s -o | -z\n", __progname);
91 exit(1);
92 }
93