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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top