当我编写单元测试时,我偶然发现了一些奇怪的行为 glibc, , 关于 "%p"NULL 指针。

如果我有一行诸如 printf("NULL pointer is %p\n", NULL);, ,然后我看到 NULL pointer is (nil) 正如我所料,打印到屏幕上。

如果我改用宽字符版本: wprintf(L"NULL pointer is %p\n", NULL);, ,然后打印出 NULL pointer is (, ,并在左括号处停止。如果我打印一个非NULL 指针,它会打印该指针,包括普通字符版本和宽字符版本。这是一个已知的错误吗 glibc, ,或者我只是错过了什么?

注意:我意识到 C 标准说指针 %p 以实现定义的方式进行转换;只是打印似乎很不寻常 ( 为一个 NULL 指针。

有帮助吗?

解决方案

这绝对是一个错误: 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);                                        \

L_("(nil)") 扩展到 L"(nil)" 对于 wprintf,但几行之后 is_long 被设定为 0 (IE。错误的)。因此 string 被解释为窄字符串,因此打印它将停止在第一个零字节处,即之后 (.

报告的错误链接: https://sourceware.org/bugzilla/show_bug.cgi?id=16890 - 这在 glibc 2.20 版本中已修复。

有趣的是,这个 bug 似乎已经存在了近 15 年才被发现并修复——报告后 2 天内!

其他提示

在 Ubuntu 14.04 LTS 上得到确认;GNU C 库(Ubuntu EGLIBC 2.19-0ubuntu6)。

这似乎是一个 报告的错误 至少在 Debian glibc 中;错误 已修复 于 2014 年 5 月 1 日发布,并应在 Glibc 2.20 中提供。只需等待上游更新即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top