/* 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; }