Как 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, чтобы придумать умные и ненавязчивые стандартные обходные пути для как можно большего числа таких ошибок, вместо того, чтобы каждый мог придумать свои собственные методы обхода после того, как их укусили, и, возможно, сделать это в субоптимальных, уродливых или хакерских способах - или, что еще хуже, способами, которые нарушают поддержку более совместимых систем.