// ccured wrappers
int dn_expand_wrapper(const u_char *msg, const u_char *eomorig,
		      const u_char *comp_dn, char *exp_dn, int length) {
  __write_at_least(exp_dn, length);
  __verify_nul(comp_dn);
  return ( dn_expand(__ptrof(msg), __ptrof(eomorig), __ptrof(comp_dn),
		     __ptrof(exp_dn), length) );
}
/* This code is from a custom allocator that allocates a header before the 
 * actual memory block */
int main() {
    struct header {
        int one;
        int *two;
        int three;
    } *h;
    char *p;
    // We allocate 3 chars but with a header
    char* v = (char*)malloc(sizeof(struct header) + 4);

#ifndef CCURED
    h = (struct header*)v; // Will check here that there is enough space in p
    h->one = 5; // Write something to the header
    p = (char*)(h + 1); // Skip the header, but this makes h SEQ
#else
    // In the CCURED version we have to play some tricks
    // Make sure h is not SEQ, so, don't do h + 1

    // We want h to be SAFE. If header did not contain pointers we could do:
    //                 h = (struct header*)v;
    // But since header contains pointers, it is not SAFE to cast from a
    // char-ptr to a header-ptr. trusted_cast wants its both ends to have
    // the same kind, which would make h SEQ. We use __ptrof instead.
    // But be careful how you use h in the future, because if you make it
    // SEQ, you will need __ptrof_qq, which does not exist!
    h = (struct header*)__ptrof(v);
    h->one = 5;
    // Use v to compute p, not h. This way h can stay SAFE.
    p = v + sizeof(struct header);
#endif
      
    // And we need the result to be SEQ
    p ++;
    p --;

    
    return 0;
}