blob: 524ca997f54a1c23afe0a1d7415a30e2189ed275 [file] [log] [blame]
// Comment "both" means tp[0] and tp[-1] are both bad.
// Otherwise only tp[-1] is bad.
#define TTT \
if (__builtin_setjmp(TTT_jmpbuf) == 0) \
{ fprintf(stderr, "about to do %d [0]\n", __LINE__); tn = tp[ 0]; } \
if (__builtin_setjmp(TTT_jmpbuf) == 0) \
{ fprintf(stderr, "about to do %d [-1]\n", __LINE__); tn = tp[-1]; }
#define b( a, c) tp = (long*)a; TTT
#define ui(op, a, c) tp = (long*)op(long)a; TTT
#define g(op, a,b,c) tp = (long*)((long)a op (long)b); TTT
#define UNU __attribute__((unused))
struct sigaction sigsegv;
// Scratch values
long a, tn __attribute__((unused));
long* tp;
// Known pointers
long* p = malloc(sizeof(long)*10); UNU long* p2 = malloc(sizeof(long)*10);
UNU long* pp = p;
// Unknown pointers
// long up[10], UNU up2[10];
// Known nonptrs; make them zero and known
long n = a ^ a, UNU n2 = n+1, UNU n7F = 0x7fffffffUL, UNU nFF = ~n;
// Unknown nonptrs; make them zero but unknown
long un = 0x01100000UL, UNU un2 = un;
// Known nonptr, from pointerness range check
UNU long nn = 0;
// Intall SEGV handler
memset(&sigsegv, 0, sizeof(sigsegv));
sigsegv.sa_handler = SEGV_handler;
sigsegv.sa_flags = SA_NODEFER; /* so we can handle signal many times */
assert( 0 == sigemptyset( &sigsegv.sa_mask ) );
assert( 0 == sigaction(SIGSEGV, &sigsegv, NULL) );