成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

無法在循環中聲明變量,固執的Linux之父終于決定升級C語言版本

系統 Linux 新聞
Linux開源社區宣布,未來會把內核C語言版本升級到C11。

本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載,轉載請聯系出處。

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

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

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

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

一個bug的連鎖反應

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

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

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

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

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

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

問題就出在這個宏上。

假設內核包含如下結構:

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

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

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

struct foo *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。

責任編輯:張燕妮 來源: 量子位
相關推薦

2022-02-25 15:49:08

Linux開源社區C語言C11

2022-02-25 14:51:39

LinuxC語言Linux 內核

2021-01-13 10:52:29

C語言Linux計算機領域

2023-02-08 07:05:44

2022-04-22 18:48:46

LinuxLinux 內核C 語言

2013-06-03 09:34:14

崩潰程序程序算法

2021-12-28 15:10:01

線程池C語言編程語言

2016-03-30 09:56:07

c語言變量聲明objectivec

2022-07-31 23:05:55

Go語言短變量

2024-01-05 08:31:08

C語言

2013-04-09 12:18:45

socket.ioC服務器

2011-05-31 13:41:00

C語言

2021-04-08 11:10:07

C語言版本Cmake

2010-07-28 15:18:10

編程語言函數式編程

2021-04-20 11:48:59

LinuxLinux內核C++

2018-09-20 17:30:01

2010-01-11 15:29:13

引用C++語言

2011-10-20 13:09:19

JavaC

2011-10-19 13:41:02

JavaC語言丹尼斯·里奇

2011-10-19 13:38:41

Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产免费黄网 | 日韩一区二区在线视频 | 午夜一区二区三区 | 91免费在线视频 | 国产一区二区三区色淫影院 | 日韩成人高清在线 | 亚洲精品无 | 亚洲一区在线观看视频 | 久久天堂网 | 久精品久久| 久操伊人| 亚洲国产精品日韩av不卡在线 | 久艹网站 | 色狠狠一区 | 在线免费观看日本视频 | 久久精品一区二区 | 亚洲人成在线播放 | 久久久久国产精品www | 欧美激情久久久 | 在线观看中文字幕一区二区 | 五月天综合影院 | 日韩视频91 | 精品一区二区视频 | 成人高清在线 | 亚洲激情av | 91视频电影 | 九九热精品视频在线观看 | 精品国产乱码久久久久久老虎 | 国产在线1区 | 久久逼逼 | 一级黄色片网址 | 亚洲小视频在线观看 | 手机av在线 | 国产精品一区二 | 亚洲精品视频在线播放 | 在线中文视频 | 亚洲国产欧美一区 | 国产一级网站 | 夜夜夜夜草 | 欧美黄色免费网站 | 欧美亚洲视频 |