2010-12-07 5 views
21

Как Linux, так и пользовательское пространство GNU (glibc), похоже, имеют множество ошибок «WONTFIX», то есть ошибок, которые ответственные стороны заявили о своем нежелании исправлять, несмотря на явно нарушающие требования ISO C и/или POSIX, m не знают о каком-либо ресурсе для программистов, в котором перечислены такие ошибки и предложения по работе с ними.Какие ошибки WONTFIX на GNU/Linux и как их обойти?

Вот несколько, которые приходят на ум:

  • The Linux UDP select ошибка: select (и связанные с ними интерфейсы) Пометка UDP дескриптор сокета файл, готовый для чтения, как только пакет был получен, без подтверждающий контрольную сумму. При последующих recv/read/и т. Д., Если контрольная сумма была недействительной, вызов блокируется. Для этого необходимо всегда устанавливать UDP-сокеты в неблокирующий режим и работать с условием EWOULDBLOCK. Если я правильно помню, MaraDNS был первым заметным проектом, затронутым этой ошибкой, и первым пожаловал (безуспешно), чтобы он исправил. Примечание: Как указывал Мартин против Лёвиса, эта ошибка с тех пор была исправлена. Обходные пути, вероятно, необходимы только в том случае, если вам необходимо поддерживать действительно устаревшие версии Linux.
  • Семейство printf в библиотеке GNU C ошибочно обрабатывает аргументы %s как многобайтовые символьные строки вместо байтовых строк, когда задана точность поля (как в %.3s), что потенциально вызывает усеченный вывод. Я не знаю обходного пути, кроме замены всей подсистемы printf (или просто не использующей семейство функций printf с строками байтов без мультибайтовых символов, но это может быть проблематично, если вы хотите обрабатывать строки устаревшей кодовой страницы, используя snprintf, в то время как в UTF -8).
  • Неправильный код errno для некоторых системных вызовов (не помню, какие из них сразу). Обычно их достаточно просто проверить, если вы просто прочитали справочные страницы GNU/Linux и сравните их со стандартом. (я не могу найти ссылки на это и, возможно, я ошибаюсь Ближайший я могу найти вопрос ENOTSUP и EOPNOTSUP, имеющих одинаковое значение, см. PDTR 24715

Что еще некоторые ошибки и обходные пути мы можем. ? добавить к этому списку Моих целей, задавая этот вопрос, являются:

  1. чтобы построить более полный список таких ошибок, так как новые, так и опытные программисты могут быстро стать известны о возможных проблемах, которые могут возникнуть при запуске intended- to-be-portable на GNU/Linux.
  2. Чтобы использовать коллективный мозг SO, чтобы придумать умные и ненавязчивые стандартные обходные пути для как можно большего числа таких ошибок, вместо того, чтобы каждый мог изобрести свои собственные методы обхода после того, как их ужалили, и, возможно, сделать это в субоптимальных, уродливых или хакерских способах - или еще хуже, тем, что нарушает поддержку более совместимых систем.
+7

Кто бы ни проголосовал за закрытие, объясните, пожалуйста. Я не вижу, как это может быть не по теме, поскольку я спросил об обходных решениях, которые явно являются темами программирования. Я признаю, что это мягко аргументированно, что было бы отдельной причиной для предложения закрытия, но если фокус - это конструктивный поиск решений, которые занимаются этими проблемами ненавязчивыми способами, а не просто виноватым, я думаю, что это стоящий вопрос. – 2010-12-07 20:59:31

+3

Какие ошибки? Если Linux не соответствует стандартам, то, очевидно, это стандарт. – 2010-12-07 21:01:40

+0

@R .. - просто шучу. но не удивляйтесь, если есть люди, которые действительно так думают. И для чего это стоит - я думаю, это хороший вопрос. – 2010-12-07 21:02:14

ответ

5

Я не могу воспроизвести проблему с printf, которую вы требуете. Запуск программы

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

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

через de_DE.UTF-8 локали гравюры «НИЗКИЙ», который смотрит прямо на меня: я просил 4 байта, и получил четыре байта (ö 2 байта). Если бы библиотека учитывала многобайтовые символы, выход должен был быть «Löwi». Это с glibc 2.11.2.

Редактировать: Изменение строки до «% .2s \ n» будет просто печатать «L», то есть только один байт. Однако, это в соответствии с the specification, который говорит

Если указана точность, не больше, чем , что многие байты должны быть записаны.

(курсив мой), а затем

Ни в коем случае частичный характер записывается.

Так, так как печать два байта (т.е. L, и ведущий байт O) приведут частичный характер записывается, было бы несоответствующим печатать неполную UTF-8.

4

Я не считаю, что проблема UDP существует. В текущем ядре Linux, 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 уже.

 Смежные вопросы

  • Нет связанных вопросов^_^