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#include <support/xstdio.h>
15
16jmp_buf rec;
17char buf[160];
18
19static void
20sigabrt (int unused)
21{
22 longjmp (rec, 1); /* recover control */
23}
24
25#undef NDEBUG
26#include <assert.h>
27static void
28assert1 (void)
29{
30 assert (1 == 2);
31}
32
33static void
34assert2 (void)
35{
36 assert (1 == 1);
37}
38
39
40#define NDEBUG
41#include <assert.h>
42static void
43assert3 (void)
44{
45 assert (2 == 3);
46}
47
48int
49main (void)
50{
51
52 volatile int failed = 1;
53
54 fclose (stderr);
55 stderr = tmpfile ();
56 if(!stderr)
57 abort ();
58
59 signal (SIGABRT, handler: sigabrt);
60
61 if (!setjmp (rec))
62 assert1 ();
63 else
64 failed = 0; /* should happen */
65
66 if (!setjmp (rec))
67 assert2 ();
68 else
69 failed = 1; /* should not happen */
70
71 if (!setjmp (rec))
72 assert3 ();
73 else
74 failed = 1; /* should not happen */
75
76 rewind (stderr);
77 xfgets (s: buf, size: 160, stderr);
78 if (!strstr (buf, "1 == 2"))
79 failed = 1;
80
81 xfgets (s: buf, size: 160, stderr);
82 if (strstr (buf, "1 == 1"))
83 failed = 1;
84
85 xfgets (s: buf, size: 160, stderr);
86 if (strstr (buf, "2 == 3"))
87 failed = 1;
88
89 return failed;
90}
91

source code of glibc/assert/test-assert.c