1 | /* Test assert(). |
2 | * |
3 | * This is hairier than you'd think, involving games with |
4 | * stdio and signals. |
5 | * |
6 | */ |
7 | |
8 | #include <signal.h> |
9 | #include <stdlib.h> |
10 | #include <stdio.h> |
11 | #include <string.h> |
12 | #include <setjmp.h> |
13 | |
14 | jmp_buf rec; |
15 | char buf[160]; |
16 | |
17 | static void |
18 | sigabrt (int unused) |
19 | { |
20 | longjmp (env: rec, val: 1); /* recover control */ |
21 | } |
22 | |
23 | #undef NDEBUG |
24 | #include <assert.h> |
25 | static void |
26 | assert1 (void) |
27 | { |
28 | assert (1 == 2); |
29 | } |
30 | |
31 | static void |
32 | assert2 (void) |
33 | { |
34 | assert (1 == 1); |
35 | } |
36 | |
37 | |
38 | #define NDEBUG |
39 | #include <assert.h> |
40 | static void |
41 | assert3 (void) |
42 | { |
43 | assert (2 == 3); |
44 | } |
45 | |
46 | int |
47 | main (void) |
48 | { |
49 | |
50 | volatile int failed = 1; |
51 | |
52 | fclose (stderr); |
53 | stderr = tmpfile (); |
54 | if(!stderr) |
55 | abort (); |
56 | |
57 | signal (SIGABRT, handler: sigabrt); |
58 | |
59 | if (!setjmp (rec)) |
60 | assert1 (); |
61 | else |
62 | failed = 0; /* should happen */ |
63 | |
64 | if (!setjmp (rec)) |
65 | assert2 (); |
66 | else |
67 | failed = 1; /* should not happen */ |
68 | |
69 | if (!setjmp (rec)) |
70 | assert3 (); |
71 | else |
72 | failed = 1; /* should not happen */ |
73 | |
74 | rewind (stderr); |
75 | fgets (s: buf, n: 160, stderr); |
76 | if (!strstr (buf, "1 == 2" )) |
77 | failed = 1; |
78 | |
79 | fgets (s: buf, n: 160, stderr); |
80 | if (strstr (buf, "1 == 1" )) |
81 | failed = 1; |
82 | |
83 | fgets (s: buf, n: 160, stderr); |
84 | if (strstr (buf, "2 == 3" )) |
85 | failed = 1; |
86 | |
87 | return failed; |
88 | } |
89 | |