cleanup-9.c
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C语言 代码 · 共 103 行
C
103 行
/* { dg-do run { target *-*-linux* powerpc*-*-darwin* } } *//* { dg-options "-fexceptions -fnon-call-exceptions -O2" } *//* Verify that cleanups work with exception handling through realtime signal frames. */#include <unwind.h>#include <stdlib.h>#include <signal.h>static _Unwind_Reason_Codeforce_unwind_stop (int version, _Unwind_Action actions, _Unwind_Exception_Class exc_class, struct _Unwind_Exception *exc_obj, struct _Unwind_Context *context, void *stop_parameter){ if (actions & _UA_END_OF_STACK) abort (); return _URC_NO_REASON;}static void force_unwind (){ struct _Unwind_Exception *exc = malloc (sizeof (*exc)); exc->exception_class = 0; exc->exception_cleanup = 0; #ifndef __USING_SJLJ_EXCEPTIONS__ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);#else _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);#endif abort ();}int count;char *null;static void counter (void *p __attribute__((unused))){ ++count;}static void handler (void *p __attribute__((unused))){ if (count != 2) abort (); exit (0);}static int __attribute__((noinline)) fn5 (){ char dummy __attribute__((cleanup (counter))); force_unwind (); return 0;}static void fn4 (int sig, siginfo_t *info, void *ctx){ char dummy __attribute__((cleanup (counter))); fn5 (); null = NULL;}static void fn3 (){ abort ();}static int __attribute__((noinline)) fn2 (){ *null = 0; fn3 (); return 0;}static int __attribute__((noinline)) fn1 (){ struct sigaction s; sigemptyset (&s.sa_mask); s.sa_sigaction = fn4; s.sa_flags = SA_RESETHAND | SA_SIGINFO; sigaction (SIGSEGV, &s, NULL); sigaction (SIGBUS, &s, NULL); fn2 (); return 0;}static int __attribute__((noinline)) fn0 (){ char dummy __attribute__((cleanup (handler))); fn1 (); null = 0; return 0;}int main(){ fn0 (); abort ();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?