还在使用89年版C语言的Linux内核,现在终于要做出改变了。今天,Linux开源社区宣布,未来会把内核C语言版本升级到C11,预计5.18版之后生效,也就是今年5月。
这个决定很突然,从发起问题到官方声明,不过才一个星期,要知道说服固执的Linux之父 Linus Torvalds可不是件容易的事。
事情的原因,说起来还有那么一点偶然的因素。
一个bug的连锁反应
问题的起源是来自上周的一次Linux社区讨论。
一位名叫Jakob Koschel的博士生,在研究阻止与内核链表primitive相关的预测执行漏洞时,发现了这样一个问题。
Linux内核广泛使用由struct list_head定义的双向链表:
structlist_head {
structlist_head *next, *prev;
};
这种结构通常嵌入到其他结构中。通过这种方式,可以使用任何相关的结构类型制作链表。
除此之外,内核还提供大量可用于遍历和操作链表的函数和宏。list_for_each_entry()就是其中之一,这是伪装成一种控制结构的宏。
问题就出在这个宏上。
假设内核包含如下结构:
structfoo {
int fooness;
structlist_headlist;
};
list中的元素可用于创建foo结构的双向链表。
假设有一个叫做 foo_list的结构声明作为此类链表的头,使用以下代码可以遍历此链表:
structfoo *iterator;
list_for_each_entry(iterator, &foo_list, list) {
do_something_with(iterator);
}
/* Should not use iterator here */
list参数告诉宏在foo结构中list_head结构的名称。这个循环将为列表中的每个元素执行一次, 迭代器指向该元素。
由此导致了USB子系统中的一个bug:传递给该宏的迭代器在退出宏后还能被使用。
这是一件危险的事情,所以Koschel提交了一个修复补丁,在循环后停止使用迭代器搞定了bug。
说服Linus
但是Linus Torvalds本人并不太喜欢这个补丁,也没有看到它与预测执行漏洞的关系。在Koschel详细解释后,Linus承认这只是一个普通的bug。
然而事情并没有那么简单,Linus不久后意识到了真正的根源:
传递给链表遍历宏的迭代器,必须在循环本身之外的范围内声明。
这种非预测性bug发生的原因是,C89中没有“在循环中声明变量”。
像list_for_each_entry()这样的宏,从根本上总是将最后一个HEAD入口泄漏到循环之外,仅仅是因为我们不能在循环本身中声明迭代器变量。
如果可以编写一个可以声明自己的迭代器列表遍历宏,那么迭代器在循环之外将不可见,并且不会出现此类问题。
但是,由于内核停留在C89标准上,因此无法在循环中声明变量。
Linus决定,那咱们还是升级吧,也许是时候转向C99标准了。
虽然它也有20多年的历史,但至少比C89新,可以在循环中声明变量。
既然C89如此陈旧,这么多年还没做出改变呢?Linus说,那是因为我们在一些古老的gcc编译器版本中遇到了一些奇怪的问题,不能随便升级。
但是,现在Linux内核已将gcc的最低要求提升至5.1版,因此过去那些奇怪的bug应该不会有了。
而另一位核心开发者Arnd Bergmann认为,咱们完全可以升级到C11甚至更高版本。但如果升级到C17或C2x,会破坏对gcc-5/6/7的支持,因此升级到C11更容易实现。
最终,Torvalds赞成这个想法:“好的,请提醒我,让我们在5.18合并窗口的早期尝试一下。”
接下来迁移到C11可能会导致一些意想不到的bug,但如果一切顺利,下一个Linus内核版本将正式转向C11。
参考链接:
[1]
https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/
[2]https://news.ycombinator.com/item?id=30459634

- 视焦点讯!登记地址无法联系,乐视网被列为经营异常天眼查App显示,近日,乐视网信息技术(北京)股份有限公司因...
- 每日视点!TikTok澳大利亚月活用户达850万,相当于澳大利亚总人口的30%据Tech时代消息,日前,TikTok首次公布了其在澳大利亚的用户...
- 世界速递!日本可口可乐售货机已支持支付宝和微信付款据电商报消息,可口可乐日本分公司在近日开业的EDION难波总店...
- “表演服”用完就退?不能放任后悔权被滥用 世界短讯“七天无理由退货”本是为了保护消费者合法权益,但有人利用...
- 周大生:去年电商业务收入同比增35%,今年目标超去年增速_全球看点周大生在机构调研时表示,2022年电商业务收入同比增长34 65%...
- 视频号运费险正式上线,首次投保根据经营类目有5档选择 环球播报据亿邦动力消息,腾讯发布“视频号小店运费险”服务指南,视...
- 淘宝发布中小商家造星计划,推出最高2000元广告补贴券淘宝宣布启动中小商家的造星计划,推出包含最高2000元广告补...
- OpenAI CEO:OpenAI还没有开始训练GPT-5大模型 天天播报据外媒报道,OpenAI首席执行官SamAltman在印度经济时报主办的一场会议
- 亚马逊与Hexa达成协作,支持卖家创建3D图像据亿邦动力消息,亚马逊和3D可视化公司Hexa达成一项新举措,...
- 属于王亚伟的时代一去不返近日屡有传闻称,昔日“公募一哥”王亚伟已被监管部门带走调...
- 智联世界,元生无界!快手虚拟人IP亮相2022人工智能大会
2022-09-07 10:47:54
- 机器人界“奥林匹克”!2022世界机器人大会8月18日举行
2022-08-10 09:58:58
- 2025年全球人口将达到90亿!机器人将在农业领域大显身手
2022-07-14 09:41:10
- 中科院院士蒋华良:AI+分子模拟与药物研发将大有可为
2022-07-14 09:37:00
- “千垛之城荷你有约” 2022兴化市荷文化旅游节正式开幕
2022-07-07 09:28:34