Linux 內(nèi)核從 C89 遷移到 C11 的新進(jìn)展
內(nèi)核開發(fā)者 Arnd Bergmann 發(fā)出了一個(gè)新的補(bǔ)丁,允許 Linux 內(nèi)核在指定 C11 的 GNU 方言時(shí)默認(rèn)使用“-std=gnu11”。這樣一來(lái),內(nèi)核將允許使用不錯(cuò)的 C99/C11 功能,而不是僅限于 C89。鑒于這一變更已經(jīng)得到了 Linus Torvalds 的支持,如果沒(méi)有發(fā)現(xiàn)任何根本性的問(wèn)題,它可能會(huì)在下一個(gè)內(nèi)核合并窗口中繼續(xù)進(jìn)行。
在一次補(bǔ)丁討論中,Linus 提出了將 C 的標(biāo)準(zhǔn)版本從 gnu89 改為 gnu99 的選擇,它允許在 for() 循環(huán)中使用變量聲明。雖然 C99、C11 和后來(lái)的標(biāo)準(zhǔn)引入了許多其他功能,但其中大部分在 gnu89 中也已經(jīng)可以作為 GNU 擴(kuò)展使用。
早些時(shí)候,gcc-5 曾試圖默認(rèn)為 -std=gnu1,但失敗了,因?yàn)楫?dāng)時(shí)這引起了對(duì)舊編譯器的指定初始化器的警告。現(xiàn)在,gcc-5.1 是用于構(gòu)建內(nèi)核的最小編譯器版本,這不再是一個(gè)問(wèn)題。同樣地,"inline"函數(shù)的行為在 gnu89 和 gnu11 之間發(fā)生了變化,但這已經(jīng)通過(guò)定義"inline"包括 __attribute__((gnu_inline)) 來(lái)解決了,以便在不久前允許用 clang 來(lái)構(gòu)建。
剩下的一個(gè)小問(wèn)題是,在使用 -Werror 構(gòu)建時(shí)添加了一個(gè)針對(duì)負(fù)整數(shù)移位的 gcc 警告,這發(fā)生在"make W=1"選項(xiàng)中,以及內(nèi)核中的三個(gè)驅(qū)動(dòng)程序總是啟用 -Werror,但目前只在 i915 驅(qū)動(dòng)程序中觀察到。為了安全起見,在 Makefile 的任何 -Wextra 中添加 -Wno-shift-negative-value。
Nathan Chancellor 報(bào)告了一個(gè)額外的 -Wdeclaration-after-statement 警告,出現(xiàn)在 arm 的 system header 中,這仍然需要一個(gè)解決方法。
gnu99、gnu11、gnu1x 和 gnu17 之間的差異相當(dāng)小,主要影響內(nèi)核從不啟用的 -Wpedantic 級(jí)別的警告。在這些版本之間,gnu11 是被所有支持的編譯器版本所支持的最新版本,盡管它只是 gcc-5 的默認(rèn)版本,而所有其他支持的 gcc 或 clang 版本都默認(rèn)為 gnu1x/gnu17。
事件的前因后果為,Linux 內(nèi)核社區(qū)日前曾討論了是否要為內(nèi)核采用現(xiàn)代 C 語(yǔ)言標(biāo)準(zhǔn)。Linus 在討論中提出了從 C89 提升到 C99 的想法;并表示,內(nèi)核代碼一直停留在 C89 的原因之一是編譯器 gcc 的舊版本會(huì)出現(xiàn)奇怪的問(wèn)題,導(dǎo)致初始化程序被破壞。但現(xiàn)在內(nèi)核要求的 GCC 最低版本已經(jīng)提高到了 v5.1,那些 bug 可能已經(jīng)不再相關(guān)。
最后事實(shí)證明,以當(dāng)前內(nèi)核的最低版本編譯器要求和當(dāng)前代碼的條件,他們實(shí)際上可以開始使用 C11 構(gòu)建內(nèi)核。Arnd Bergmann 提議直接升級(jí)到 C11 甚至 C2x。雖然他不確定 C11 是否會(huì)帶來(lái)任何對(duì)內(nèi)核有用的新內(nèi)容,但如果升級(jí)到 C17 或 C2x,會(huì)破壞對(duì) gcc-5/6/7 的支持;因此升級(jí)到 C11 更容易實(shí)現(xiàn),而且跨越太大內(nèi)核社區(qū)未必接受。
Linus 對(duì)該想法表示了贊成。在 Bergmann 確認(rèn)此舉可行后,Linus 宣布將在下一個(gè)內(nèi)核版本 v5.18 中嘗試使用 C11 標(biāo)準(zhǔn)。
更多詳情可查看??郵件列表??。
本文轉(zhuǎn)自O(shè)SCHINA
本文標(biāo)題:Linux 內(nèi)核從 C89 遷移到 C11 的新進(jìn)展
本文地址:https://www.oschina.net/news/184534/linux-kernel-c89-to-c11