未來Linux Kernel 將不支持可變長數組VLA
內核開發者 Kees Cook 遞交了移除可變長數組的 pull request, Linux 4.20 或 5.0 將不再依賴於可變長數組。可變長數組(variable length array,簡稱 VLA)是指數組對象的長度在運行時而不是編譯時確定。
但使用 VLA 會存在問題,包括增加運行時開銷——因為數組長度需要在運行時確定; LLVM Clang 編譯器不支持結構內 VLA,它只支持 C99 風格的 VLA;存在安全隱患。Linus Torvalds 對 VLA 的使用公開表達過不贊成,認為相比固定長度,VLA 產生了更多的代碼和更慢的代碼。
通過開發中的Linux 4.20內核,它現在可以實現無VLA …可變長度數組(VLA)可以方便並且是C99標準的一部分,但可能會產生意想不到的後果。
VLA允許在運行時而不是編譯時確定數組長度。 Linux內核長期以來一直依賴於內核不同部分的VLA(包括結構內部),但現在持續數月(如果計算內核Clang的工作數年,則已經過去幾年)已經刪除了可變長度數組的使用在內核中。它們的問題是:
由於需要在運行時確定數組的大小,因此使用可變長度數組會給代碼添加一些較小的運行時開銷。
LLVM Clang編譯器不支持結構中的VLA,因此對於那些想要在GCC之外構建內核的人來說,Clang只支持C99風格的VLA。
可以說最重要的是,VDA可能會對內核的堆棧使用產生安全隱患。
Linus Torvalds在過去對VLA的使用表達了他的不滿,例如「使用VLA是積極的愚蠢!它產生了更多代碼,更多slower代碼(和更脆弱的代碼)」,而不僅僅是使用固定的密鑰大小「。
特別是在過去的幾個周期中,已經有代碼消除了內核對VLA的使用,並且到目前為止這個Linux 4.20~5.0周期仍在繼續。內核中有超過200個依賴於VLA的點,但現在最新的Linux Git代碼應該基本結束了。
Kees Cook今天發出了拉取請求,用於移除VLA,現在,如果在內核的C代碼中找到任何可變長度數組,則「-Wvla」編譯器標誌會發出警告。這將有助於防止新代碼無意中使用VLA,並發現仍依賴於此行為的任何延遲內核代碼。
Kees Cook寫道,可能還有一些地方可以找到VLA,「可能會有更多的VLA隱藏在難以找到的randconfig中,但是在linux-next的上個月左右沒有任何大的震動我們現在應該基本上沒有VLA了!」
※微軟開放6萬項專利技術,叫停Linux專利戰
※centos7 install docker-ce
TAG:Linux資訊速推 |