错误发生过程

早上的时候想着编译一个linux内核,说不定以后调内核能用到
然后我就从kernel.org下载了稳定版本的Latest Release
latest_release

然后就很正常的编译

1
2
make x86_64_defconfig
make menuconfig

改了改不想要的选项,然后make -j 14,然后就寄了
acpi

查错

看了一下,说是"abcd"这样的长度为5的字符串被赋值到长度为4的buffer?
翻了一下源码,确实是有一个字符串长度为4的字符串数组被赋值了类似"abcd"这样的长度5的字符串

(但其实这里的真正含义是字节数组的数组,并非字符串数组)

这里有个宏定义,声明了字节数组长度为4
nameseg_size

这里是字节数组的数组的定义
array

然后就翻了一下这段代码是谁写的,在github上用blame看了一下

blame
哎这对吗,linus老爷子亲自写了这行代码😂

完整的commit信息在这里
linus老爷子在两周前发现了这个问题,在commit中说到__nonstring不被gcc14接受
因为这是一个字符数组的数组,gcc14无法理解这种情况下的__nonstring

老爷子说自己被这个破属性设计搞的很烦,于是最后用CFLAG屏蔽了这个错误

1
2
#Currently, disable -Wunterminated-string-initialization as an error
KBUILD_CFLAGS += $(call cc-option, -Wno-error=unterminated-string-initialization)

改为了

1
2
#Currently, disable -Wunterminated-string-initialization as broken
KBUILD_CFLAGS += $(call cc-option, -Wno-unterminated-string-initialization)

然后删去了原来的数组定义中的__nonstring,大概是防止gcc14报错?

emm,看到这样一个问题还挺有意思的,而且发现写内核的人对于代码的理解真的是在另一个层次
比如字节数组,我是真没想到过还可以这样玩。

仿佛是一个开发前线反馈给gcc要求新功能的缩影,很有意思