/
githubmirror
/
glibc
Обзор
Документация
Войти
/
githubmirror
/
glibc
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
assert/test-assert-perr.c
88 строк
1 KB
Frederic Berat
tests: replace fgets by xfgets
14 июн 2023, 02:59
14 июн 2023, 02:59
7ba426a
Код
Авторство
О чём код?
/* Test assert_perror(). * * 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> #include <support/xstdio.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_perror (1); } static void assert2 (void) { assert_perror (0); } #define NDEBUG #include <assert.h> static void assert3 (void) { assert_perror (2); } int main(void) { volatile int failed = 1; /* safety in presence of longjmp() */ 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); xfgets (buf, 160, stderr); if (!strstr(buf, strerror (1))) failed = 1; xfgets (buf, 160, stderr); if (strstr (buf, strerror (0))) failed = 1; xfgets (buf, 160, stderr); if (strstr (buf, strerror (2))) failed = 1; return failed; }