但使用 VLA 會存在問題,包括增長運行時開銷——由於數組長度須要在運行時肯定; LLVM Clang 編譯器不支持結構內 VLA,它只支持 C99 風格的 VLA;存在安全隱患。Linus Torvalds 對 VLA 的使用公開表達過不同意,認爲相比固定長度,VLA 產生了更多的代碼和更慢的代碼。html
經過開發中的Linux 4.20內核,它如今能夠實現無VLA ...可變長度數組(VLA)能夠方便而且是C99標準的一部分,但可能會產生意想不到的後果。linux
VLA容許在運行時而不是編譯時肯定數組長度。 Linux內核長期以來一直依賴於內核不一樣部分的VLA(包括結構內部),但如今持續數月(若是計算內核Clang的工做數年,則已通過去幾年)已經刪除了可變長度數組的使用在內核中。它們的問題是:數組
- 因爲須要在運行時肯定數組的大小,所以使用可變長度數組會給代碼添加一些較小的運行時開銷。安全
- LLVM Clang編譯器不支持結構中的VLA,所以對於那些想要在GCC以外構建內核的人來講,Clang只支持C99風格的VLA。併發
- 能夠說最重要的是,VDA可能會對內核的堆棧使用產生安全隱患。htm
Linus Torvalds在過去對VLA的使用表達了他的不滿,例如「使用VLA是積極的愚蠢!它產生了更多代碼,更多_slower_代碼(和更脆弱的代碼)」,而不單單是使用固定的密鑰大小「。開發
特別是在過去的幾個週期中,已經有代碼消除了內核對VLA的使用,而且到目前爲止這個Linux 4.20~5.0週期仍在繼續。內核中有超過200個依賴於VLA的點,但如今最新的Linux Git代碼應該基本結束了。get
Kees Cook今天發出了拉取請求,用於移除VLA,如今,若是在內核的C代碼中找到任何可變長度數組,則「-Wvla」編譯器標誌會發出警告。這將有助於防止新代碼無心中使用VLA,並發現仍依賴於此行爲的任何延遲內核代碼。編譯器
Kees Cook寫道,可能還有一些地方能夠找到VLA,「可能會有更多的VLA隱藏在難以找到的randconfig中,可是在linux-next的上個月左右沒有任何大的震動咱們如今應該基本上沒有VLA了!」it
原文來自:https://www.linuxidc.com/Linux/2018-10/155076.htm
本文地址:https://www.linuxprobe.com/linux-kernel-vla.html編輯:周曉雪,審覈員:逄增寶