wprintf:NULL 포인터가 있는 %p
문제
단위 테스트를 작성하는 동안 나는 이상한 동작을 발견했습니다. 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
(즉.거짓).결과적으로 string
좁은 문자열로 해석되므로 인쇄는 첫 번째 0바이트에서 중지됩니다.후 (
.
보고된 버그 링크: https://sourceware.org/bugzilla/show_bug.cgi?id=16890 - glibc 버전 2.20에서는 이 문제가 수정되었습니다.
흥미롭게도 이 버그는 발견되어 수정되기까지 거의 15년 동안 존재했던 것으로 보입니다. 보고된 지 2일 만에 말이죠!