wprintf:% p con puntatore NULLO
Domanda
Mentre stavo scrivendo un test unitario, mi sono imbattuto in qualche strano comportamento da glibc
, relativo "%p"
e il NULL
puntatore.
Se ho una linea come printf("NULL pointer is %p\n", NULL);
, allora vedo NULL pointer is (nil)
stampato sullo schermo, come mi aspettavo.
Se invece uso la versione a caratteri larghi: wprintf(L"NULL pointer is %p\n", NULL);
, poi stampa fuori NULL pointer is (
, e si ferma alla parentesi di apertura.Se si stampa un non-NULL
pointer, stampa quel puntatore, sia le versioni normali che quelle a caratteri larghi.È un bug noto di glibc
, o mi manca solo qualcosa?
NB:Mi rendo conto che lo standard C dice che i puntatori con %p
vengono convertiti in modo definito dall'implementazione;sembra insolito solo stampare (
per un NULL
puntatore.
Soluzione
Questo è sicuramente un bug: https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=stdio-common/vfprintf.c;hb=c15cf13a8a672bd27bf3d94b995c52872eed537d#l932
934 /* Write "(nil)" for a nil pointer. */ \
935 string = (CHAR_T *) L_("(nil)"); \
936 /* Make sure the full string "(nil)" is printed. */ \
937 if (prec < 5) \
938 prec = 5; \
939 is_long = 0; /* This is no wide-char string. */ \
940 goto LABEL (print_string); \
Il L_("(nil)")
si espande a L"(nil)"
per wprintf, ma un paio di righe più tardi is_long
è impostato su 0
(ossia.falso).Conseguenza string
viene interpretato come una stringa di caratteri stretti, quindi la stampa si fermerà al suo primo byte zero, ad es.dopo il (
.
Segnalato bug link: https://sourceware.org/bugzilla/show_bug.cgi?id=16890 - questo è risolto nella versione 2.20 di glibc.
È interessante notare che questo bug sembra esistere da quasi 15 anni prima che fosse trovato e risolto - entro 2 giorni dalla sua segnalazione!
Altri suggerimenti
confermato su Ubuntu 14.04 LTS;Libreria GNU C (Ubuntu Eglibc 2.19-0ubuntu6).
Sembra essere un segnalato bug in almenoDebian glibc;The Bug è stato risolto il 1 ° maggio 2014, edovrebbe essere disponibile in GLIBC 2.20.Aspetta gli aggiornamenti a monte.