문제

단위 테스트를 작성하는 동안 나는 이상한 동작을 발견했습니다. 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일 만에 말이죠!

다른 팁

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