2010-12-07 2 views
21

리눅스와 GNU 사용자 공간 (glibc) 모두 ISO C 및/또는 POSIX의 요구 사항을 명백히 위반 함에도 불구하고 책임감있는 당사자들이 수정하지 않으려는 버그를 포함하여 "WONTFIX" 이러한 버그를 나열한 프로그래머를위한 리소스와이를 해결하기위한 제안을 모르고 있습니다. 여기 GNU/Linux의 WONTFIX 버그는 무엇이고 어떻게 해결할 수 있습니까?

마음에 와서 그 몇 가지 있습니다 :

  • 리눅스 UDP select 버그 : select (및 관련 인터페이스) 플래그 즉시 패킷이 수신 된대로 읽기위한 준비 UDP 소켓 파일 설명없이 체크섬을 확인합니다. 후속 recv/read/etc에서 체크섬이 유효하지 않으면 통화가 차단됩니다. 이 문제를 해결하려면 항상 UDP 소켓을 비 차단 모드로 설정하고 EWOULDBLOCK 조건을 처리해야합니다. 내가 올바르게 기억한다면, MaraDNS는이 버그의 영향을받은 주목할만한 프로젝트 중 첫 번째 프로젝트였으며, 처음으로 MaraDNS를 수정 (불만족스럽게)하자. 참고 : Martin v. Löwis가 지적한 것처럼이 버그는 수정되었습니다. 해결 방법은 아마도 오래된 버전의 Linux를 지원해야하는 경우에만 필요합니다.
  • GNU C 라이브러리의 printf 패밀리는 필드 정밀도 (%.3s)가 지정 될 때 %s에 대한 인수를 바이트 문자열 대신 멀티 바이트 문자열로 잘못 처리하므로 잠재적으로 잘리지 않는 출력이 발생합니다. 나는 printf 서브 시스템 전체를 바꾸는 것 외에는 (또는 단순히 멀티 바이트 문자가 아닌 바이트 문자열과 함께 printf 패밀리를 사용하지 않고 있지만, UTF에서 snprintf을 사용하여 레거시 - 코드 페이지 문자열을 처리하려는 경우에는 문제가 될 수 있습니다. -8 로켈).
  • Wrong errno 특정 시스템 호출에 대한 결과 코드 (어떤 시스템이 정상적으로 작동하는지 기억할 수 없음). 일반적으로 이들은 GNU/Linux 매뉴얼 페이지를 읽고 표준과 비교하는지 쉽게 확인할 수 있습니다. (나는이에 대한 참조를 찾을 수 없습니다 아마도 내가 잘못이다 내가 찾을 수있는 가장 가까운 ENOTSUPEOPNOTSUP가 같은 값을 갖는 문제이다. PDTR 24715를 참조

을 좀 더 버그와 해결 방법 우리가 할 수있는은 무엇입니까. ?이 목록에 추가 내 목표를이 질문에는 다음과 같습니다 신규 및 경험이 풍부한 프로그래머가 빠르게 intended-을 실행할 때 발생할 수있는 잠재적 인 문제를 인식 될 수 있도록

  1. 는 버그의 더 완전한 목록을 만들려면 GNU/Linux의 이식성있는 프로그램
  2. SO 집단의 두뇌를 활용하여 가능한 한 많은 버그에 대해 현명하고 눈에 거슬리지 않는 표준 해결책을 생각해보십시오. 모든 사람이 찌르면 자신의 해결책을 고안하지 않아도되고, 차선책, 못생긴 또는 해킹하는 방식으로 그렇게 할 수도 있습니다. 최악의 경우,보다 많은 규칙을 따르는 시스템에 대한 지원을 중단하는 방식으로
+7

누가 투표를 종료했는지 설명 해주십시오. 분명히 프로그래밍 주제 인 해결 방법에 대해 물어 본 이후로 이것이 어떻게 주제와 관련이 없는지 알 수 없습니다. 나는 그것이 종결을 제안하는 별도의 이유가 될 수있는 다소 논쟁의 여지가 있음을 인정하지만, 초점이 단순한 blamefest가 아닌 눈에 거슬리는 방식으로 이러한 문제를 다루는 해결책을 건설적으로 찾는 것이라면 나는 그것이 가치있는 질문이라고 생각한다. –

+3

어떤 버그가 있습니까? Linux가 표준을 준수하지 않는다면, 그것은 분명히 잘못된 표준입니다. –

+0

@R .. - 농담. 실제로 이런 식으로 생각하는 사람들이 있다면 놀라지 않을 것입니다. 그리고 그것이 가치있는 일인가 - 이것이 좋은 질문이라고 생각합니다. –

답변

5

귀하가 주장하는 printf 문제를 재현 할 수 없습니다. 바로 나에게 보이는 de_DE.UTF-8 로케일 인쇄 "LOW"에서 프로그램

#include <stdio.h> 
#include <locale.h> 

int main() 
{ 
     setlocale(LC_ALL, ""); 
     printf("%.4s\n", "Löwis"); 
     return 0; 
} 

실행 : 나는 4 바이트를 요청하고, (O 2 바이트) 4 바이트를 얻었다. 라이브러리가 멀티 바이트 문자를 계산했다면 출력은 "LOW"이어야합니다. 이것은 glibc 2.11.2와 같습니다.

편집 : 문자열을 "% .2s \ n"으로 변경하면 "L"즉 한 바이트 만 인쇄됩니다. 그러나이 the specification에 부합되고, 바이트가 작성되어야한다고보다 정밀도가 지정되면

, 더 이상 을 말한다있다. 어떠한 경우

(강조 광산) 다음

는 부분 문자 기입 한다.

그래서 부분 캐릭터가 작성되는 초래 두 바이트 (즉, L, 및 (O)의 선두 바이트)를 출력하기 때문에, 불완전한 UTF-8을 인쇄 비 순응 될 것이다.

+0

니스 찾기! 그러나 당신은 실제 질문 대신 그의 예제에 초점을 맞추고 있습니다 : 버그를 해결하는 방법. 버그가 아니라는 것을 증명하기 위해 각각의 예제를 하나 하나 뒤쫓아 가면서 더 많은 예제를 분출하게 할 것입니다. – Konerak

+3

''xxxö ''로 변경하면 3 바이트 만 남습니다. 이것은 멍청한 예이지만 로케일의 인코딩과 일치하지 않는 여러 인코딩에서 문자열을 사용하여 작업하려는 경우 실제 예가됩니다. ISO C에서는 ('% s'은 순수 바이트 단위로 지정 되었기 때문에)이 작업을 수행 할 수 있지만 glibc는이를 금지합니다. 어쨌든 나는이 것들이 버그인지에 대해 논쟁하고 싶지 않습니다. 그들은 잘 자격이있는 사람들이 이미 잘 문서화되어 있습니다. 문제 및 해결 방법 목록을 작성하는 방법에 대해 묻습니다. –

+1

또는 형식 문자열을' "% .2s"'로 변경하여 버그를 확인하십시오. –

4

UDP 문제가 실제로 존재하지 않는다고 생각합니다. 현재 리눅스 커널에서 현재 udp_poll는

/** 
*  udp_poll - wait for a UDP event. 
*  @file - file struct 
*  @sock - socket 
*  @wait - poll table 
* 
*  This is same as datagram poll, except for the special case of 
*  blocking sockets. If application is using a blocking fd 
*  and a packet with checksum error is in the queue; 
*  then it could get return from select indicating data available 
*  but then block when reading it. Add special case code 
*  to work around these arguably broken applications. 
*/ 
unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) 
{ 
     unsigned int mask = datagram_poll(file, sock, wait); 
     struct sock *sk = sock->sk; 

     /* Check for false positives due to checksum errors */ 
     if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) && 
      !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk)) 
       mask &= ~(POLLIN | POLLRDNORM); 

     return mask; 

} 

그래서 선택/설문 조사를 통해보고되는 잘못된 체크섬 UDP 패킷을 숨길 않는 날 것으로 보인다 읽습니다. 이 버전의 코드는 개정 85584672 (2009) 이후로 사용 중입니다. 하지만 (적어도 2005 년 이후) 코드는 이미 select/poll에서 잘못된 패킷을 삭제하는 것과 같은 종류의 작업을 수행하고있었습니다.

+0

니스 찾기! 그러나 당신은 실제 질문 대신 그의 예제에 초점을 맞추고 있습니다 : 버그를 해결하는 방법. 버그가 아니라는 것을 증명하기 위해 각각의 예제를 하나 하나 뒤쫓아 가면서 더 많은 예제를 분출하게 할 것입니다. – Konerak

+3

하지만 특정 이슈를 찾고 특정 해결 방법을 게시하는 것이이 기사의 주장 된 목적입니다. 따라서 처음 두 가지 문제에 대해서는 해결 방법이 필요하지 않습니다 (현재 버전 이상). 그래서 이것이 실제 문제라고 믿는 사람은 그들이 그렇지 않다는 것을 알면 도움이되고 있습니다. 실제 버그가 표시되면 해결 방법을 논의 할 수 있습니다. –

+0

당신이 맞습니다. 그것이 원래 있던 것이기 때문에 나는 그것을 WONTFIX로 열거했다. 외관상으로는 충분한 사람들은 실제로 고침을 받았다고 (또는 커널 내부가 충분히 고쳐서 고치기가 쉽지 않음) 불평했다. 찾기 주셔서 감사합니다. 다른 하나는 표준을 잘못 읽었습니다. –

관련 문제