Linux 核心從 C89 遷移到 C11 的新進展

2022-03-01 09:00:25

核心開發者 Arnd Bergmann 發出了一個新的,允許 Linux 核心在指定 C11 的 GNU 方言時預設使用「-std=gnu11」。這樣一來,核心將允許使用不錯的 C99/C11 功能,而不是僅限於 C89。鑑於這一變更已經得到了 Linus Torvalds 的支援,如果沒有發現任何根本性的問題,它可能會在下一個核心合併視窗中繼續進行。

在一次修補程式討論中,Linus 提出了將 C 的標準版本從 gnu89 改為 gnu99 的選擇,它允許在 for() 迴圈中使用變數宣告。雖然 C99、C11 和後來的標準引入了許多其他功能,但其中大部分在 gnu89 中也已經可以作為 GNU 擴充套件使用。

早些時候,gcc-5 曾試圖預設為 -std=gnu1,但失敗了,因為當時這引起了對舊編譯器的指定初始化器的警告。現在,gcc-5.1 是用於構建核心的最小編譯器版本,這不再是一個問題。同樣地,"inline"函數的行為在 gnu89 和 gnu11 之間發生了變化,但這已經通過定義"inline"包括 __attribute__((gnu_inline)) 來解決了,以便在不久前允許用 clang 來構建。

剩下的一個小問題是,在使用 -Werror 構建時新增了一個針對負整數移位的 gcc 警告,這發生在"make W=1"選項中,以及核心中的三個驅動程式總是啟用 -Werror,但目前只在 i915 驅動程式中觀察到。為了安全起見,在 Makefile 的任何 -Wextra 中新增 -Wno-shift-negative-value。

Nathan Chancellor 報告了一個額外的 -Wdeclaration-after-statement 警告,出現在 arm 的 system header 中,這仍然需要一個解決方法。

gnu99、gnu11、gnu1x 和 gnu17 之間的差異相當小,主要影響核心從不啟用的 -Wpedantic 級別的警告。在這些版本之間,gnu11 是被所有支援的編譯器版本所支援的最新版本,儘管它只是 gcc-5 的預設版本,而所有其他支援的 gcc 或 clang 版本都預設為 gnu1x/gnu17。

事件的前因後果為,Linux 核心社群日前曾在 Bergmann 此舉可行後,Linus 宣佈將在下一個核心版本 v5.18 中嘗試使用 C11 標準。

更多詳情可。

展開閱讀全文