Как Linux, так и пользовательское пространство GNU (glibc), похоже, имеют множество ошибок WONTFIX, то есть ошибки, которые ответственные стороны заявили о своем нежелании исправлять, несмотря на явно нарушающие требования ISO C и/или POSIX, но я "Не зная о каком-либо ресурсе для программистов, который перечисляет такие ошибки и предложения для работы вокруг них.
Вот некоторые из них, которые приходят на ум:
- Ошибка UDP Linux
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.
Какие еще ошибки и обходные пути мы можем добавить в этот список? Мои цели в задании этого вопроса:
- Чтобы создать более полный список таких ошибок, чтобы как новые, так и опытные программисты могли быстро узнать о потенциальных проблемах, которые могут возникнуть при запуске программы, предназначенной для переноски, в GNU/Linux.
- Чтобы использовать коллективный мозг SO, чтобы придумать умные и ненавязчивые стандартные обходные пути для как можно большего числа таких ошибок, вместо того, чтобы каждый мог придумать свои собственные методы обхода после того, как их укусили, и, возможно, сделать это в субоптимальных, уродливых или хакерских способах - или, что еще хуже, способами, которые нарушают поддержку более совместимых систем.