后来合并的Linux6.8的新特性之一是启用-Wstringop-overflow编译器选项以警告可能的缓冲区溢出在编译器可以在编译时检测到此类可能溢出的情况下。虽然这在理论上是好的,但GCC上的问题导致Linus Torvalds从现在的Linux6.8禁用了这个编译器选项。
正如Phoronix上一篇关于该主题的文章中指出的那样,对于新的内核构建,“-wstringop-overflow”选项是无条件启用的,但由于已知的编译器错误,当使用GCC 11编译器时例外。但事实证明,GCC 11并不是唯一一个出现坏Wstringop溢出的编译器行为。
莱纳斯已提交周四,他发布了自己的新补丁,并评论道:
事实证明,不仅仅是GCC-11出了问题。显然,它只是碰巧能在x86-64和其他GCC版本上运行。
在ARM64上,我看到了GCC 13.2.1版的警告,内核测试机器人在S390上报告了同样的问题,GCC 13.2.0。
诚然,这似乎只是新的Xe DRM驱动程序,但这让我无法进行正常的arm64构建测试。因此,它会被还原,直到有人找出问题的原因(以及为什么它在x86-64上没有显示出来,这让我怀疑它从来都不只是GCC-11的问题,更多的是随机事件)。
这也稍微改变了KCONFIG的命名--只需将“为GCC禁用此功能”条件设置为一个简单的KCONFIG条目,一旦我们找到正确的规则,我们就可以将GCC的版本依赖项放入该条目中。
如果问题纯粹出在Xe驱动程序中,则版本Dependency_可能仍然是“GCC版本大于11”,但即使是这种情况,让我们将其全部作为“GCC_NO_STRINGOP_OVERFLOW”逻辑的一部分。
目前,我们只是对所有GCC版本禁用它,具体原因尚不清楚。
Torvalds在测试内核构建时一直使用Apple Silicon MacBook Air作为他的笔记本电脑,这似乎是这个编译器选项遇到的非x86_64构建问题。
We'll see if this situation gets sorted out in time for the Linux 6.8 stable release in March or if the "-Wstringop-overflow" behavior is more widespread/problematic for non-x86_64 architectures that there may not be a short-term fix.