将来Linux Kernel 将不支持可变长数组VLA

但使用 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编辑:周晓雪,审核员:逄增宝

相关文章
相关标签/搜索