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 14jmp_buf rec; 15char buf[160]; 16 17static void 18sigabrt (int unused) 19{ 20 longjmp (rec, 1); /* recover control */ 21} 22 23#undef NDEBUG 24#include <assert.h> 25static void 26assert1 (void) 27{ 28 assert (1 == 2); 29} 30 31static void 32assert2 (void) 33{ 34 assert (1 == 1); 35} 36 37 38#define NDEBUG 39#include <assert.h> 40static void 41assert3 (void) 42{ 43 assert (2 == 3); 44} 45 46int 47main (void) 48{ 49 50 volatile int failed = 1; 51 52 fclose (stderr); 53 stderr = tmpfile (); 54 if(!stderr) 55 abort (); 56 57 signal (SIGABRT, 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 (buf, 160, stderr); 76 if (!strstr (buf, "1 == 2")) 77 failed = 1; 78 79 fgets (buf, 160, stderr); 80 if (strstr (buf, "1 == 1")) 81 failed = 1; 82 83 fgets (buf, 160, stderr); 84 if (strstr (buf, "2 == 3")) 85 failed = 1; 86 87 return failed; 88} 89