Linux Kernel 將移除可變長陣列
核心開發者 Kees Cook 遞交了移除可變長陣列的ofollow,noindex">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了!Wheee。:)“
Linux公社的RSS地址 :https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-10/1550.htm