Home | History | Annotate | Download | only in tests
      1 
      2    // Comment "both" means tp[0] and tp[-1] are both bad.
      3    // Otherwise only tp[-1] is bad.
      4 
      5    #define TTT \
      6       if (__builtin_setjmp(TTT_jmpbuf) == 0) \
      7       { fprintf(stderr,  "about to do %d [0]\n", __LINE__); tn = tp[ 0]; } \
      8       if (__builtin_setjmp(TTT_jmpbuf) == 0) \
      9       { fprintf(stderr, "about to do %d [-1]\n", __LINE__); tn = tp[-1]; }
     10 
     11    #define b(    a,  c)   tp = (long*)a;                    TTT
     12    #define ui(op, a,  c)  tp = (long*)op(long)a;            TTT
     13    #define g(op, a,b,c)   tp = (long*)((long)a op (long)b); TTT
     14    #define UNU            __attribute__((unused))
     15 
     16    struct sigaction sigsegv;
     17    // Scratch values
     18    long  a, tn;
     19    long* tp;
     20 
     21    // Known pointers
     22    long* p = malloc(sizeof(long)*10);  UNU long* p2 = malloc(sizeof(long)*10);
     23    UNU long* pp = p;
     24    // Unknown pointers
     25 //   long up[10], UNU up2[10];
     26 
     27    // Known nonptrs;  make them zero and known
     28    long n = a ^ a, UNU n2 = n+1, UNU n7F = 0x7fffffffUL, UNU nFF = ~n;
     29 
     30    // Unknown nonptrs;  make them zero but unknown
     31    long un = 0x01100000UL, UNU un2 = un;
     32 
     33    // Known nonptr, from pointerness range check
     34    UNU long nn = 0;
     35 
     36    // Intall SEGV handler
     37    memset(&sigsegv, 0, sizeof(sigsegv));
     38    sigsegv.sa_handler = SEGV_handler;
     39    sigsegv.sa_flags   = SA_NODEFER; /* so we can handle signal many times */
     40    assert( 0 == sigemptyset( &sigsegv.sa_mask ) );
     41    assert( 0 == sigaction(SIGSEGV, &sigsegv, NULL) );
     42