欧美性猛交xxx,亚洲精品丝袜日韩,色哟哟亚洲精品,色爱精品视频一区

中國物流行業網 新聞中心
中國物流行業網 > 新聞中心 > 產品技術 > 內容

Linux之父終于被勸動:用了30年的Linux內核C語言將升級至C11

  來源:中國物流行業網   時間:2022-2-28 9:40

  還在使用89年版C語言的Linux內核,現在終于要做出改變了。

  今天,Linux開源社區宣布,未來會把內核C語言版本升級到C11,預計5.18版之后生效,也就是今年5月。

  這個決定很突然,從發起問題到官方聲明,不過才一個星期,要知道說服固執的Linux之父 Linus Torvalds可不是件容易的事。

  事情的原因,說起來還有那么一點偶然的因素。

  一個bug的連鎖反應

  問題的起源是來自上周的一次Linux社區討論。

  一位名叫Jakob Koschel的博士生,在研究阻止與內核鏈表primitive相關的預測執行漏洞時,發現了這樣一個問題。

  Linux內核廣泛使用由struct list_head定義的雙向鏈表:

  這種結構通常嵌入到其他結構中。通過這種方式,可以使用任何相關的結構類型制作鏈表。

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

  問題就出在這個宏上。

  假設內核包含如下結構:

  list中的元素可用于創建foo結構的雙向鏈表。

  假設有一個叫做 foo_list的結構聲明作為此類鏈表的頭,使用以下代碼可以遍歷此鏈表:

  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

免責聲明:本網所有內容均轉載自其它網絡媒體,不代表本網贊同其觀點并不對其真實性負責。如有侵權請及時聯系本網,本網將在第一時間刪除!
Copyright © 2012-2025 cn56.net.cn All Rights Reserved 中國物流行業網 版權所有
主站蜘蛛池模板: 息烽县| 巢湖市| 博乐市| 宜良县| 嘉鱼县| 正安县| 新田县| 马山县| 浮梁县| 东兰县| 岑溪市| 安国市| 玉田县| 贡觉县| 东乡| 商河县| 海晏县| 南靖县| 乌鲁木齐县| 平武县| 呼玛县| 增城市| 资阳市| 安新县| 乌拉特后旗| 泸水县| 陵川县| 旅游| 泰来县| 凤台县| 平舆县| 弥渡县| 泽库县| 通山县| 集安市| 临汾市| 红河县| 保靖县| 凉山| 乐至县| 齐齐哈尔市|