allocaをinline関数で使うと危険である?
“allocaをinline関数で使うと危険である"という要旨のメールがoss-securityに流れてて、これは一体どういうことだ…と思った。
長い文章でも無いしそんなに難しくもないが、どうやらGCCのオプティマイザの展開順に問題があるようだ。
http://www.openwall.com/lists/oss-security/2017/04/10/18
曰く、alloca(本文ではC(99)のVLAを指していた)を見つけるとGCCはそれを__builtin_alloca
に展開した後、そのinline関数をインライン展開するので、ループ中で使うとスタックをガンガン持ってかれるということだった。
allocaは任意のスコープではなく、関数スコープからの離脱でのみスタックの巻き戻しを行うので、ループ本体を一巡したあとに本来巻き戻って欲しいスタックが巻き戻らず、次のallocaが行われてスタックが枯渇する脆弱性になると指摘している。
試しにMLに張られたコードに足りない部分を補完してバイナリを見てみたが、どうにも普通に巻き戻しはしているように見える。
-O
から既にインライン展開は行われるが、いくつかの最適化レベルを眺めてもやはり巻き戻しているように見える。
なにか別の要因があるのだろうか…