From: Ralph Corderoy Date: Sun, 24 Sep 2017 15:22:15 +0000 (+0100) Subject: picksbr.c: fprintf(3) function pointer using `%p' and union. X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/4b846eff7deb83d1019868cabf7f794651502432 picksbr.c: fprintf(3) function pointer using `%p' and union. Using `%#llx' and cast to `unsigned long long' caused Cygwin woes. Fixes 07916b2ff. --- diff --git a/h/mh.h b/h/mh.h index a97a2e43..31cf01b1 100644 --- a/h/mh.h +++ b/h/mh.h @@ -3,6 +3,19 @@ #include +/* It's undefined behaviour in C99 to convert from a function pointer to + * a data-object pointer, e.g. void pointer. gcc's -pedantic warns of + * this and can stop compilation. POSIX requires the operation however, + * e.g. for dlsym(3), and so we know it's safe on POSIX platforms, e.g. + * the pointers are of the same size. Thus use a union to subvert gcc's + * check. The function-pointer equivalent of a void pointer is any + * function-pointer type as all function pointers are defined to be + * convertible from one another; use the simplest available. */ +typedef union { + void *v; + void (*f)(void); +} generic_pointer; + /* * Well-used constants */ diff --git a/sbr/done.c b/sbr/done.c index cd76fac5..5f2bc8db 100644 --- a/sbr/done.c +++ b/sbr/done.c @@ -7,19 +7,6 @@ #include -/* It's undefined behaviour in C99 to convert from a function pointer to - * a data-object pointer, e.g. void pointer. gcc's -pedantic warns of - * this and can stop compilation. POSIX requires the operation however, - * e.g. for dlsym(3), and so we know it's safe on POSIX platforms, e.g. - * the pointers are of the same size. Thus use a union to subvert gcc's - * check. The function-pointer equivalent of a void pointer is any - * function-pointer type as all function pointers are defined to be - * convertible from one another; use the simplest available. */ -typedef union { - void *v; - void (*f)(void); -} generic_pointer; - static void (*altexit)(int) NORETURN = exit; /* set_done changes the path of done() from exit(3), or back to exit(3). diff --git a/uip/picksbr.c b/uip/picksbr.c index 432bcf10..2eddab7f 100644 --- a/uip/picksbr.c +++ b/uip/picksbr.c @@ -519,7 +519,10 @@ PRaction (struct nexus *n, int level) dasctime (&n->n_tws, TW_NULL)); return; } - fprintf(stderr, "UNKNOWN(%#llx)\n", (unsigned long long)n->n_action); + + generic_pointer gp; + gp.f = (void (*)(void))n->n_action; + fprintf(stderr, "UNKNOWN(%p)\n", gp.v); }