0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux開(kāi)源社區(qū)宣布未來(lái)會(huì)把內(nèi)核C語(yǔ)言版本升級(jí)到C11

Linux愛(ài)好者 ? 來(lái)源:量子位 ? 作者:量子位 ? 2022-03-24 14:59 ? 次閱讀

還在使用89年版C語(yǔ)言Linux內(nèi)核,現(xiàn)在終于要做出改變了。

近日,Linux開(kāi)源社區(qū)宣布,未來(lái)會(huì)把內(nèi)核C語(yǔ)言版本升級(jí)到C11,預(yù)計(jì)5.18版之后生效,也就是今年5月。

這個(gè)決定很突然,從發(fā)起問(wèn)題到官方聲明,不過(guò)才一個(gè)星期,要知道說(shuō)服固執(zhí)的Linux之父 Linus Torvalds可不是件容易的事。

事情的原因,說(shuō)起來(lái)還有那么一點(diǎn)偶然的因素。

一個(gè)bug的連鎖反應(yīng)

問(wèn)題的起源是來(lái)自上周的一次Linux社區(qū)討論。

一位名叫Jakob Koschel的博士生,在研究阻止與內(nèi)核鏈表primitive相關(guān)的預(yù)測(cè)執(zhí)行漏洞時(shí),發(fā)現(xiàn)了這樣一個(gè)問(wèn)題。

Linux內(nèi)核廣泛使用由struct list_head定義的雙向鏈表:

structlist_head{
structlist_head*next,*prev;
};

這種結(jié)構(gòu)通常嵌入到其他結(jié)構(gòu)中。通過(guò)這種方式,可以使用任何相關(guān)的結(jié)構(gòu)類型制作鏈表。

除此之外,內(nèi)核還提供大量可用于遍歷和操作鏈表的函數(shù)和宏。list_for_each_entry()就是其中之一,這是偽裝成一種控制結(jié)構(gòu)的宏。

問(wèn)題就出在這個(gè)宏上。

假設(shè)內(nèi)核包含如下結(jié)構(gòu):

structfoo{
intfooness;
structlist_headlist;
};

list中的元素可用于創(chuàng)建foo結(jié)構(gòu)的雙向鏈表。

假設(shè)有一個(gè)叫做 foo_list的結(jié)構(gòu)聲明作為此類鏈表的頭,使用以下代碼可以遍歷此鏈表:

structfoo*iterator;

list_for_each_entry(iterator,&foo_list,list){
do_something_with(iterator);
}
/*Shouldnotuseiteratorhere*/

list參數(shù)告訴宏在foo結(jié)構(gòu)中l(wèi)ist_head結(jié)構(gòu)的名稱。這個(gè)循環(huán)將為列表中的每個(gè)元素執(zhí)行一次, 迭代器指向該元素。

由此導(dǎo)致了USB子系統(tǒng)中的一個(gè)bug:傳遞給該宏的迭代器在退出宏后還能被使用。

這是一件危險(xiǎn)的事情,所以Koschel提交了一個(gè)修復(fù)補(bǔ)丁,在循環(huán)后停止使用迭代器搞定了bug。

說(shuō)服Linus

但是Linus Torvalds本人并不太喜歡這個(gè)補(bǔ)丁,也沒(méi)有看到它與預(yù)測(cè)執(zhí)行漏洞的關(guān)系。在Koschel詳細(xì)解釋后,Linus承認(rèn)這只是一個(gè)普通的bug。

然而事情并沒(méi)有那么簡(jiǎn)單,Linus不久后意識(shí)到了真正的根源:

傳遞給鏈表遍歷宏的迭代器,必須在循環(huán)本身之外的范圍內(nèi)聲明。

這種非預(yù)測(cè)性bug發(fā)生的原因是,C89中沒(méi)有“在循環(huán)中聲明變量”。

像list_for_each_entry()這樣的宏,從根本上總是將最后一個(gè)HEAD入口泄漏到循環(huán)之外,僅僅是因?yàn)槲覀儾荒茉谘h(huán)本身中聲明迭代器變量。

如果可以編寫一個(gè)可以聲明自己的迭代器列表遍歷宏,那么迭代器在循環(huán)之外將不可見(jiàn),并且不會(huì)出現(xiàn)此類問(wèn)題。

但是,由于內(nèi)核停留在C89標(biāo)準(zhǔn)上,因此無(wú)法在循環(huán)中聲明變量。

Linus決定,那咱們還是升級(jí)吧,也許是時(shí)候轉(zhuǎn)向C99標(biāo)準(zhǔn)了。

雖然它也有20多年的歷史,但至少比C89新,可以在循環(huán)中聲明變量。

既然C89如此陳舊,這么多年還沒(méi)做出改變呢?Linus說(shuō),那是因?yàn)槲覀冊(cè)谝恍┕爬系膅cc編譯器版本中遇到了一些奇怪的問(wèn)題,不能隨便升級(jí)。

但是,現(xiàn)在Linux內(nèi)核已將gcc的最低要求提升至5.1版,因此過(guò)去那些奇怪的bug應(yīng)該不會(huì)有了。

而另一位核心開(kāi)發(fā)者Arnd Bergmann認(rèn)為,咱們完全可以升級(jí)到C11甚至更高版本。但如果升級(jí)到C17或C2x,會(huì)破壞對(duì)gcc-5/6/7的支持,因此升級(jí)到C11更容易實(shí)現(xiàn)。

最終,Torvalds贊成這個(gè)想法:“好的,請(qǐng)?zhí)嵝盐?,讓我們?cè)?.18合并窗口的早期嘗試一下?!?/p>

接下來(lái)遷移到C11可能會(huì)導(dǎo)致一些意想不到的bug,但如果一切順利,下一個(gè)Linus內(nèi)核版本將正式轉(zhuǎn)向C11。

原文標(biāo)題:Linux之父終于被勸動(dòng):用了30年的Linux內(nèi)核C語(yǔ)言將升級(jí)至C11

文章出處:【微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1346

    瀏覽量

    40152
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11164

    瀏覽量

    208468
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135563

原文標(biāo)題:Linux之父終于被勸動(dòng):用了30年的Linux內(nèi)核C語(yǔ)言將升級(jí)至C11

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    DSP算法大全C語(yǔ)言版本_

    本帖最后由 Stark揚(yáng) 于 2018-10-19 16:25 編輯 DSP算法大全C語(yǔ)言版本_
    發(fā)表于 08-20 17:33

    FatFS升級(jí)到0.12c版本

    FatFS升級(jí)到0.12c版本
    發(fā)表于 03-31 11:03

    請(qǐng)問(wèn)如何升級(jí)SDK的Linux內(nèi)核RTLinux上呢?

    (t-firefly.com)),支持將SDK的Linux內(nèi)核升級(jí)到RTLinux。(1)RTLinux的源碼是開(kāi)源的嗎?(2)SDK的內(nèi)核
    發(fā)表于 12-09 16:43

    DSP算法大全C語(yǔ)言版本

    DSP算法大全C語(yǔ)言版本
    發(fā)表于 11-01 16:57 ?0次下載

    LED燈閃爍程序【C語(yǔ)言版

    LED燈閃爍程序【C語(yǔ)言版】LED燈閃爍程序【C語(yǔ)言版】LED燈閃爍程序【C語(yǔ)言版
    發(fā)表于 12-28 17:40 ?0次下載

    跑馬燈程序【C語(yǔ)言版

    跑馬燈程序【C語(yǔ)言版】跑馬燈程序【C語(yǔ)言版】跑馬燈程序【C語(yǔ)言版】跑馬燈程序【
    發(fā)表于 12-29 10:59 ?0次下載

    按鍵移位程序【C語(yǔ)言版

    按鍵移位程序【C語(yǔ)言版】按鍵移位程序【C語(yǔ)言版】按鍵移位程序【C語(yǔ)言版】按鍵移位程序【
    發(fā)表于 12-29 11:04 ?0次下載

    LED流水燈程序【C語(yǔ)言版

    LED流水燈程序【C語(yǔ)言版】LED流水燈程序【C語(yǔ)言版】LED流水燈程序【C語(yǔ)言版】LED流水燈
    發(fā)表于 12-29 11:05 ?0次下載

    單片機(jī)制作繼電器 【C語(yǔ)言版

    單片機(jī)制作繼電器 【C語(yǔ)言版】單片機(jī)制作繼電器 【C語(yǔ)言版】單片機(jī)制作繼電器 【C語(yǔ)言版】單片機(jī)
    發(fā)表于 12-29 13:53 ?0次下載

    數(shù)碼管(靜態(tài)顯示)【C語(yǔ)言版

    數(shù)碼管(靜態(tài)顯示)【C語(yǔ)言版】數(shù)碼管(靜態(tài)顯示)【C語(yǔ)言版】數(shù)碼管(靜態(tài)顯示)【C語(yǔ)言版】數(shù)碼管
    發(fā)表于 12-29 15:27 ?0次下載

    LED點(diǎn)陣顯示數(shù)字【C語(yǔ)言版

    LED點(diǎn)陣顯示數(shù)字【C語(yǔ)言版】 LED點(diǎn)陣顯示數(shù)字【C語(yǔ)言版】 LED點(diǎn)陣顯示數(shù)字【C語(yǔ)言版
    發(fā)表于 12-29 15:54 ?0次下載

    linux內(nèi)核C語(yǔ)言的編程風(fēng)格

    linux 內(nèi)核C語(yǔ)言的編程風(fēng)格
    發(fā)表于 09-26 14:22 ?0次下載

    TI中DSP算法大全C語(yǔ)言版本

    TI中DSP算法大全C語(yǔ)言版本
    發(fā)表于 04-09 17:53 ?0次下載

    Linux內(nèi)核中常用的C語(yǔ)言技巧有哪些

    Linux內(nèi)核采用的是GCC編譯器,GCC編譯器除了支持ANSI C,還支持GNU C。在Linux內(nèi)核
    的頭像 發(fā)表于 05-12 14:45 ?560次閱讀

    DSP算法大全C語(yǔ)言版本

    DSP算法大全C語(yǔ)言版本
    發(fā)表于 09-13 16:43 ?16次下載