c - GNU/Linux 上的 WONTFIX 错误是什么以及如何解决它们?

标签 c linux posix standards-compliance

很难说出这里问的是什么。这个问题是模棱两可的、含糊的、不完整的、过于宽泛或修辞的,不能以目前的形式得到合理的回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




11 年前关闭。




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

以下是一些想到的:

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

  • 我们可以添加到此列表中的更多错误和解决方法是什么?我提出这个问题的目的是:
  • 构建更完整的此类错误列表,以便新老程序员都能快速意识到在 GNU/Linux 上运行预期可移植程序时可能出现的潜在问题。
  • 利用 SO 集体大脑为尽可能多的此类错误想出聪明且不引人注目的标准解决方法,而不是每个人都必须在被蛰后发明自己的解决方法,并且可能以次优、丑陋或骇人听闻的方式这样做 - 或者更糟然而,以打破对更一致的系统的支持的方式。
  • 最佳答案

    我无法重现您声称的 printf 问题。运行程序

    #include <stdio.h>
    #include <locale.h>
    
    int main()
    {
            setlocale(LC_ALL, "");
            printf("%.4s\n", "Löwis");
            return 0;
    }
    

    在 de_DE.UTF-8 语言环境中打印“Löw”,这对我来说是正确的:我要求 4 个字节,得到 4 个字节(ö 是 2 个字节)。如果库计算多字节字符,输出应该是“Löwi”。这是 glibc 2.11.2。

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

    If the precision is specified, no more than that many bytes shall be written.



    (强调我的),然后

    In no case shall a partial character be written.



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

    关于c - GNU/Linux 上的 WONTFIX 错误是什么以及如何解决它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381430/

    相关文章:

    linux - Perf 在 Ubuntu 中无法正常工作

    linux - Bash 脚本自动化

    javascript - [A-Z]{2,4} 不限于 2 到 4 个字符

    C 编程语言练习 3-2 在数组中打印转义字符

    c - 数据类型范围因操作系统而异

    c - Strtok - 在行尾读取空字符串

    c - 将值输入到结构体指针中

    c - 使用库函数存储值时结构中的变量损坏

    php - 如何将 pid 从一个 PHP 进程传递到另一个?

    c++ - C++ 中的作用域 _t 结尾名称