Linux 内核从 C89 迁移到 C11 新进展

共 1514字,需浏览 4分钟

 ·

2022-03-11 05:10

来源:开源中国


内核开发者 Arnd Bergmann 发出了一个新的补丁,允许 Linux 内核在指定 C11 的 GNU 方言时默认使用“-std=gnu11”。这样一来,内核将允许使用不错的 C99/C11 功能,而不是仅限于 C89。鉴于这一变更已经得到了 Linus Torvalds 的支持,如果没有发现任何根本性的问题,它可能会在下一个内核合并窗口中继续进行。

在一次补丁讨论中,Linus 提出了将 C 的标准版本从 gnu89 改为 gnu99 的选择,它允许在 for() 循环中使用变量声明。虽然 C99、C11 和后来的标准引入了许多其他功能,但其中大部分在 gnu89 中也已经可以作为 GNU 扩展使用。

早些时候,gcc-5 曾试图默认为 -std=gnu1,但失败了,因为当时这引起了对旧编译器的指定初始化器的警告。现在,gcc-5.1 是用于构建内核的最小编译器版本,这不再是一个问题。同样地,"inline"函数的行为在 gnu89 和 gnu11 之间发生了变化,但这已经通过定义"inline"包括 __attribute__((gnu_inline)) 来解决了,以便在不久前允许用 clang 来构建。

剩下的一个小问题是,在使用 -Werror 构建时添加了一个针对负整数移位的 gcc 警告,这发生在"make W=1"选项中,以及内核中的三个驱动程序总是启用 -Werror,但目前只在 i915 驱动程序中观察到。为了安全起见,在 Makefile 的任何 -Wextra 中添加 -Wno-shift-negative-value。

Nathan Chancellor 报告了一个额外的 -Wdeclaration-after-statement 警告,出现在 arm 的 system header 中,这仍然需要一个解决方法。

gnu99、gnu11、gnu1x 和 gnu17 之间的差异相当小,主要影响内核从不启用的 -Wpedantic 级别的警告。在这些版本之间,gnu11 是被所有支持的编译器版本所支持的最新版本,尽管它只是 gcc-5 的默认版本,而所有其他支持的 gcc 或 clang 版本都默认为 gnu1x/gnu17。

事件的前因后果为,Linux 内核社区日前曾讨论了是否要为内核采用现代 C 语言标准。Linus 在讨论中提出了从 C89 提升到 C99 的想法;并表示,内核代码一直停留在 C89 的原因之一是编译器 gcc 的旧版本会出现奇怪的问题,导致初始化程序被破坏。但现在内核要求的 GCC 最低版本已经提高到了 v5.1,那些 bug 可能已经不再相关。

最后事实证明,以当前内核的最低版本编译器要求和当前代码的条件,他们实际上可以开始使用 C11 构建内核。Arnd Bergmann 提议直接升级到 C11 甚至 C2x。虽然他不确定 C11 是否会带来任何对内核有用的新内容,但如果升级到 C17 或 C2x,会破坏对 gcc-5/6/7 的支持;因此升级到 C11 更容易实现,而且跨越太大内核社区未必接受。

Linus 对该想法表示了赞成。在 Bergmann 确认此举可行后,Linus 宣布将在下一个内核版本 v5.18 中尝试使用 C11 标准。

Linux学习指南

有收获,点个在看 

浏览 25
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报