| /* Test assert(). |
| * |
| * This is hairier than you'd think, involving games with |
| * stdio and signals. |
| * |
| */ |
| |
| #include <signal.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <setjmp.h> |
| |
| jmp_buf rec; |
| char buf[160]; |
| |
| static void |
| sigabrt (int unused) |
| { |
| longjmp (rec, 1); /* recover control */ |
| } |
| |
| #undef NDEBUG |
| #include <assert.h> |
| static void |
| assert1 (void) |
| { |
| assert (1 == 2); |
| } |
| |
| static void |
| assert2 (void) |
| { |
| assert (1 == 1); |
| } |
| |
| |
| #define NDEBUG |
| #include <assert.h> |
| static void |
| assert3 (void) |
| { |
| assert (2 == 3); |
| } |
| |
| int |
| main (void) |
| { |
| |
| volatile int failed = 1; |
| |
| fclose (stderr); |
| stderr = tmpfile (); |
| if(!stderr) |
| abort (); |
| |
| signal (SIGABRT, sigabrt); |
| |
| if (!setjmp (rec)) |
| assert1 (); |
| else |
| failed = 0; /* should happen */ |
| |
| if (!setjmp (rec)) |
| assert2 (); |
| else |
| failed = 1; /* should not happen */ |
| |
| if (!setjmp (rec)) |
| assert3 (); |
| else |
| failed = 1; /* should not happen */ |
| |
| rewind (stderr); |
| fgets (buf, 160, stderr); |
| if (!strstr (buf, "1 == 2")) |
| failed = 1; |
| |
| fgets (buf, 160, stderr); |
| if (strstr (buf, "1 == 1")) |
| failed = 1; |
| |
| fgets (buf, 160, stderr); |
| if (strstr (buf, "2 == 3")) |
| failed = 1; |
| |
| return failed; |
| } |