wprintf:%p mit NULL-Zeiger
Frage
Als ich einen Unit-Test schrieb, stieß ich auf ein seltsames Verhalten von glibc
, hinsichtlich "%p"
und das NULL
Zeiger.
Wenn ich eine Zeile habe wie printf("NULL pointer is %p\n", NULL);
, dann verstehe ich NULL pointer is (nil)
wie erwartet auf dem Bildschirm gedruckt.
Wenn ich stattdessen die Breitzeichenversion verwende: wprintf(L"NULL pointer is %p\n", NULL);
, dann wird es ausgedruckt NULL pointer is (
, und stoppt bei der öffnenden Klammer.Wenn ich ein nicht ausdruckeNULL
Zeiger, es gibt diesen Zeiger aus, sowohl in der Normal- als auch in der Breitzeichenversion.Ist das ein bekannter Fehler? glibc
, oder übersehe ich einfach etwas?
Hinweis:Mir ist klar, dass der C-Standard besagt, dass Zeiger mit sind %p
werden in einer durch die Implementierung definierten Weise konvertiert;Es scheint einfach ungewöhnlich, nur zu drucken (
Für ein NULL
Zeiger.
Lösung
Das ist definitiv ein Fehler: 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); \
Der L_("(nil)")
erweitert sich auf L"(nil)"
für wprintf, aber ein paar Zeilen später is_long
ist eingestellt auf 0
(d. h.FALSCH).Infolge string
wird als schmale Zeichenkette interpretiert, so dass der Ausdruck beim ersten Null-Byte stoppt, d. h.nach dem (
.
Link zum gemeldeten Fehler: https://sourceware.org/bugzilla/show_bug.cgi?id=16890 – Dies wurde in Version 2.20 von glibc behoben.
Interessanterweise scheint dieser Fehler fast 15 Jahre lang existiert zu haben, bevor er entdeckt und behoben wurde – und zwar innerhalb von zwei Tagen nach seiner Meldung!
Andere Tipps
Bestätigt unter Ubuntu 14.04 LTS;GNU C-Bibliothek (Ubuntu EGLIBC 2.19-0ubuntu6).
Es scheint ein zu sein Fehler gemeldet zumindest in Debian glibc;der Fehler wurde repariert am 1. Mai 2014 veröffentlicht und sollte in Glibc 2.20 verfügbar sein.Warten Sie einfach auf Upstream-Updates.