未來Linux Kernel 將不支持可變長數組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了!”

原文來自:https://www.linuxidc.com/Linux/2018-10/155076.htm

本文地址:https://www.linuxprobe.com/linux-kernel-vla.html編輯:周曉雪,審覈員:逄增寶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章