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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top