GNU/Linux上有哪些WONTFIX错误以及如何解决它们?

R..*_*R.. 21 c linux posix standards-compliance

Linux和GNU用户空间(glibc)似乎都有一些"WONTFIX"错误,即责任方已声明他们不愿意修复的错误,尽管明显违反了ISO C和/或POSIX的要求,但我不知道程序员的任何资源,列出了这些错误和解决它们的建议.

以下是一些想到的:

  • Linux UDP select错误:( select和相关接口)标记UDP套接字文件描述符,一旦收到数据包就准备好读取,而不确认校验和.在后续recv/ read/ etc.,如果校验和无效,则调用将阻塞.解决此问题需要始终将UDP套接字设置为非阻塞模式并处理该EWOULDBLOCK情况.如果我没记错的话,MaraDNS是第一个受这个bug影响的着名项目,也是第一个抱怨(不成功)修复它的项目.注意:正如Martinv.Löwis所指出的,显然这个bug已被修复.如果您需要支持真正过时的Linux版本,可能只需要解决方法.
  • 当指定字段精度(如)时printf,GNU C库中的族错误地将参数%s视为多字节字符串而不是字节字符串%.3s,从而可能导致截断输出.我知道除了替换整个printf子系统之外没有解决方法(或者根本不使用printf具有非多字节字符字符串的函数系列,但如果你想snprintf在UTF-8语言环境中使用while 处理遗留代码页字符串,这可能会有问题).
  • errno某些系统调用的结果代码错误(无法记住哪些系统调用正确).通常这些很容易检查您是否只是阅读GNU/Linux手册页并将它们与标准进行比较.(我无法找到此引用,也许我错了我能找到最接近的是问题,ENOTSUP并且EOPNOTSUP具有相同的价值;见PDTR 24715.

我们可以添加到此列表中的更多错误和解决方法是什么?我提出这个问题的目的是:

  1. 构建更完整的此类错误列表,以便新手和有经验的程序员能够快速了解​​在GNU/Linux上运行预期可移植程序时可能出现的潜在问题.
  2. 利用SO集体大脑来思考尽可能多的此类错误的聪明且不显眼的标准解决方法,而不是每个人都必须在被蜇后发明自己的变通方法,并且可能以次优,丑陋或hackish方式这样做 - 或者更糟糕然而,以打破对更符合要求的系统的支持的方式.

Mar*_*wis 5

我无法重现您声明的printf问题.运行程序

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

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

在de_DE.UTF-8语言环境中打印"Löw",它看起来对我来说:我要求4个字节,并得到4个字节(ö是2个字节).如果库计算了多字节字符,则输出应为"Löwi".这是glibc 2.11.2.

编辑:将字符串更改为"%.2s \n"将只打印"L",即只有一个字节.但是,这符合规范,即说明

如果指定了精度,则不会超过很多字节将被写入.

(强调我的),然后

在任何情况下都不得写出部分字符.

因此,由于打印两个字节(即L和ö的前导字节)将导致写入部分字符,因此将不符合打印不完整的UTF-8.

  • 尝试将其更改为"xxxö",您将看到只有3个字节.这是一个愚蠢的例子,但是一个真实的例子是,如果您尝试使用与区域设置编码不匹配的多种不同编码中的字符串.ISO C允许你这样做(因为'%s`纯粹以字节为单位指定)但glibc禁止它.无论如何,我不想争论这些事情是否是错误.他们已经由合格的人员充分记录.我问的是建立一系列问题和解决方法. (3认同)