自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

系統(tǒng) Linux
今天,Linux 開源社區(qū)宣布,未來會把內(nèi)核 C 語言版本升級到 C11,預計 5.18 版之后生效,也就是今年 5 月。


還在使用 89 年版 C 語言的 Linux 內(nèi)核,現(xiàn)在終于要做出改變了。今天,Linux 開源社區(qū)宣布,未來會把內(nèi)核 C 語言版本升級到 C11預計 5.18 版之后生效,也就是今年 5 月。

這個決定很突然,從發(fā)起問題到官方聲明,不過才一個星期,要知道說服固執(zhí)的 Linux 之父 Linus Torvalds 可不是件容易的事。事情的原因,說起來還有那么一點偶然的因素。

一個 bug 的連鎖反應

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

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

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

struct list_head {
    struct list_head *next*prev;
    };

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

除此之外,內(nèi)核還提供大量可用于遍歷和操作鏈表的函數(shù)和宏。list_for_each_entry () 就是其中之一,這是偽裝成一種控制結構的宏。問題就出在這個宏上。假設內(nèi)核包含如下結構:

struct foo {
        int fooness;
    struct list_head list;
    };

list 中的元素可用于創(chuàng)建 foo 結構的雙向鏈表。假設有一個叫做 foo_list 的結構聲明作為此類鏈表的頭,使用以下代碼可以遍歷此鏈表:

struct foo *iterator;

    list_for_each_entry(iterator&foo_listlist) {
        do_something_with(iterator);
    }
    /* Should not use iterator here */

list 參數(shù)告訴宏在 foo 結構中 list_head 結構的名稱。這個循環(huán)將為列表中的每個元素執(zhí)行一次,迭代器指向該元素。由此導致了 USB 子系統(tǒng)中的一個 bug:傳遞給該宏的迭代器在退出宏后還能被使用。

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

說服 Linus

但是 Linus Torvalds 本人并不太喜歡這個補丁,也沒有看到它與預測執(zhí)行漏洞的關系。在 Koschel 詳細解釋后,Linus 承認這只是一個普通的 bug。

然而事情并沒有那么簡單,Linus 不久后意識到了真正的根源:傳遞給鏈表遍歷宏的迭代器,必須在循環(huán)本身之外的范圍內(nèi)聲明。這種非預測性 bug 發(fā)生的原因是,C89 中沒有“在循環(huán)中聲明變量”。

像 list_for_each_entry () 這樣的宏,從根本上總是將最后一個 HEAD 入口泄漏到循環(huán)之外,僅僅是因為我們不能在循環(huán)本身中聲明迭代器變量。

如果可以編寫一個可以聲明自己的迭代器列表遍歷宏,那么迭代器在循環(huán)之外將不可見,并且不會出現(xiàn)此類問題。但是,由于內(nèi)核停留在 C89 標準上,因此無法在循環(huán)中聲明變量。

Linus 決定,那咱們還是升級吧,也許是時候轉向 C99 標準了。雖然它也有 20 多年的歷史,但至少比 C89 新,可以在循環(huán)中聲明變量。

既然 C89 如此陳舊,這么多年還沒做出改變呢?Linus 說,那是因為我們在一些古老的 gcc 編譯器版本中遇到了一些奇怪的問題,不能隨便升級。

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

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

最終,Torvalds 贊成這個想法:“好的,請?zhí)嵝盐?,讓我們?5.18 合并窗口的早期嘗試一下?!苯酉聛磉w移到 C11 可能會導致一些意想不到的 bug,但如果一切順利,下一個 Linux 內(nèi)核版本將正式轉向 C11。

參考鏈接:

[1]https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/

[2]https://news.ycombinator.com/item?id=30459634


責任編輯:龐桂玉 來源: IT之家
相關推薦

2022-04-22 18:48:46

LinuxLinux 內(nèi)核C 語言

2022-03-01 08:58:10

Linux 內(nèi)核C11GNU 方言

2022-02-25 14:13:28

LinuxC語言開發(fā)

2021-04-20 11:48:59

LinuxLinux內(nèi)核C++

2022-02-25 15:49:08

Linux開源社區(qū)C語言C11

2021-01-13 10:52:29

C語言Linux計算機領域

2022-08-26 09:02:57

代碼庫編程語言

2023-01-03 15:47:09

Linux內(nèi)核C語言

2020-06-01 21:07:33

C11C++11內(nèi)存

2020-11-11 14:48:41

Linux內(nèi)核代碼

2022-06-27 12:44:34

RustLinux

2020-09-18 06:44:57

MSVC微軟C11

2021-03-24 15:17:13

編程語言C語言OS

2022-08-27 10:53:15

C語言Linux內(nèi)核

2011-05-31 13:41:00

C語言

2021-07-29 20:29:36

Linux c 代碼Java

2023-07-26 08:54:39

2010-09-26 10:10:10

Linux內(nèi)核

2013-04-08 16:19:46

Linux內(nèi)核內(nèi)核升級

2012-07-31 16:11:25

Linux內(nèi)核系統(tǒng)運維
點贊
收藏

51CTO技術棧公眾號