mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 00:16:11 +00:00
55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
#include <assert.h>
|
|
#include <setjmp.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
// Regression test for bug 91162: if a client had a SEGV signal handler,
|
|
// and jumped to a bogus address, Valgrind would abort. With the fix,
|
|
// the following test runs to completion correctly.
|
|
|
|
static jmp_buf myjmpbuf;
|
|
|
|
static
|
|
void SIGSEGV_handler(int signum)
|
|
{
|
|
longjmp(myjmpbuf, 1);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
struct sigaction sigsegv_new, sigsegv_saved;
|
|
int res;
|
|
|
|
/* Install own SIGSEGV handler */
|
|
sigsegv_new.sa_handler = SIGSEGV_handler;
|
|
sigsegv_new.sa_flags = 0;
|
|
#if !defined(__APPLE__) && !defined(__sun)
|
|
sigsegv_new.sa_restorer = NULL;
|
|
#endif
|
|
res = sigemptyset( &sigsegv_new.sa_mask );
|
|
assert(res == 0);
|
|
|
|
res = sigaction( SIGSEGV, &sigsegv_new, &sigsegv_saved );
|
|
assert(res == 0);
|
|
|
|
if (setjmp(myjmpbuf) == 0) {
|
|
// Jump to zero; will cause seg fault
|
|
#if defined(__powerpc64__) && (_CALL_ELF != 2)
|
|
unsigned long int fn[3];
|
|
fn[0] = 0;
|
|
fn[1] = 0;
|
|
fn[2] = 0;
|
|
#else
|
|
void (*fn)(void) = 0;
|
|
#endif
|
|
((void(*)(void)) fn) ();
|
|
fprintf(stderr, "Got here??\n");
|
|
} else {
|
|
fprintf(stderr, "Signal caught, as expected\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|