Linux内核5.18计划允许使用C语言标准C11

在讨论一组补丁来修复链表代码中与 Spectre 相关的问题时,很明显,如果允许符合较新版本标准的 C 代码进入内核,则可以更优雅地解决该问题。 目前,添加的内核代码必须符合 89 年制定的 ANSI C (C1989) 规范。

代码中与 Spectre 相关的问题是由于在循环后继续使用单独定义的迭代器引起的——使用宏来迭代链表的元素,并且由于循环迭代器被传递给该宏,因此在循环本身之外定义并在循环后保持可用。 使用 C99 标准将允许在 for() 块中定义循环变量,这将解决问题而无需提出解决方法。

Linus Torvalds 同意实现对较新规范的支持的想法,并建议在 5.18 内核中切换到 11 年发布的 C2011 标准。 在初步测试中,新模式下的 GCC 和 Clang 构建均顺利通过,没有出现任何偏差。 如果在更彻底的测试过程中没有出现意外问题,则 5.18 内核构建脚本中的“--std=gnu89”选项将替换为“--std=gnu11 -Wno-shift-negative-value”。 还考虑了使用C17标准的可能性,但在这种情况下,就需要增加GCC的最低支持版本。 C11 支持的包含符合 GCC 版本 (5.1) 的当前要求。

来源: opennet.ru

添加评论