未来Linux Kernel 将不支持可变长数组VLA
更新时间:2018-11-19

Kees Cook今天发出了拉取请求,用于移除VLA,当初,假如在内核的C代码中找到任何可变长度数组,则“-Wvla”编译器标志会发出忠告。这将有助于防止新代码无意中使用VLA,并发现仍依附于此举动的任何延迟内核代码。

通过开发中的Linux 4.20内核,它现在可能实现无VLA ...可变长度数组(VLA)可以方便并且是C99标准的一部分,但可能会产生意想不到的结果。

特别是在过去的多少个周期中,已经有代码消除了内核查VLA的使用,并且到目前为止这个Linux 4.20~5.0周期仍在连续。内核中有超过200个依赖于VLA的点,但现在最新的Linux Git代码应该基本结束了。

[daodu]内核开发者 Kees Cook 递交了移除可变长数组的 pull request, Linux 4.20 或 5.0 将不再依赖于可变长数组。可变长数组(variable length array,简称 VLA)是指数组对象的长度在运行时而不是编译时断定。[/daodu]

- 由于需要在运行时确定数组的大小,因此使用可变长度数组会给代码增添一些较小的运行时开销。

- LLVM Clang编译器不支撑构造中的VLA,因而对那些想要在GCC之外构建内核的人来说,Clang只支持C99作风的VLA。

Kees Cook写道,可能还有一些地方可以找到VLA,“可能会有更多的VLA隐藏在难以找到的randconfig中,然而在linux-next的上个月左右不任何大的震动咱们现在应当基本上不VLA了!”

但使用 VLA 会存在问题,包含增加运行时开销——因为数组长度须要在运行时肯定; LLVM Clang 编译器不支持结构内 VLA,它只支持 C99 风格的 VLA;存在保险隐患。Linus Torvalds 对 VLA 的使用公开表白过不批准,认为比较固定长度,VLA 产生了更多的代码跟更慢的代码。

VLA允许在运行时而不是编译时判断数组长度。 Linux内核长期以来始终依靠于内核不同部分的VLA(包括结构内部),但当初持续数月(如果打算内核Clang的工作数年,则已经从前多少年)已经删除了可变长度数组的利用在内核中。它们的问题是:

标签 linux 代码 内核 长度 编译器

- 能够说最重要的是,VDA可能会对内核的堆栈使用产生安全隐患。

Linus Torvalds在从前对VLA的应用抒发了他的不满,例如“使用VLA是踊跃的愚笨!它发生了更多代码,更多_slower_代码(跟更脆弱的代码)”,而不仅仅是使用固定的密钥大小“。


友情链接:
Copyright 2018-2021 心水论坛 版权所有,未经授权,禁止转载。