本当は怖いHPC

HPC屋の趣味&実益ブログ

[ネタ] GNU Flexのバグ:定数定義が長いと死ぬ

上(前)の記事の最後にFlexがBuffer Overflowで死ぬと書いたけど、原因は正規表現が長いことではなくて、定数定義(?)のバッファが固定長であるためだった。

結論から言うと、俺のやりたいこと(FlexUnicodeプロパティを使う)を行うためには、\p{category}を展開することに加えて、このバグを回避できるように定数展開を先取りすることですね。もう自分で鬼車使ってスキャナジェネレータ作ったほうが早い気がしてきた


実証コード

$ flex --version                                                                                                             
flex version 2.5.4

$ ruby | flex                                                                                                                
print <<EOS
VAR #{"a" * 4000}
%%
. {}
%%
EOS
*** buffer overflow detected ***: flex terminated
======= Backtrace: =========
/lib/libc.so.6(__chk_fail+0x41)[0x1f23a1]
/lib/libc.so.6(__strcpy_chk+0x43)[0x1f18b3]
flex[0x8056302]
flex[0x8058975]
flex[0x80523c9]
flex[0x804ee00]
flex[0x804fcc8]
/lib/libc.so.6(__libc_start_main+0xdc)[0x125dec]
flex[0x80489a1]
======= Memory map: ========
00110000-0024a000 r-xp 00000000 fd:00 1573082    /lib/libc-2.5.so
0024a000-0024c000 r-xp 0013a000 fd:00 1573082    /lib/libc-2.5.so
0024c000-0024d000 rwxp 0013c000 fd:00 1573082    /lib/libc-2.5.so
0024d000-00250000 rwxp 0024d000 00:00 0
00582000-0059b000 r-xp 00000000 fd:00 1572903    /lib/ld-2.5.so
0059b000-0059c000 r-xp 00019000 fd:00 1572903    /lib/ld-2.5.so
0059c000-0059d000 rwxp 0001a000 fd:00 1572903    /lib/ld-2.5.so
0064a000-0064b000 r-xp 0064a000 00:00 0          [vdso]
008fa000-00905000 r-xp 00000000 fd:00 1573104    /lib/libgcc_s-4.1.2-20070626.so.1
00905000-00906000 rwxp 0000a000 fd:00 1573104    /lib/libgcc_s-4.1.2-20070626.so.1
08048000-0806b000 r-xp 00000000 fd:00 1024287    /usr/bin/flex
0806b000-0806d000 rw-p 00023000 fd:00 1024287    /usr/bin/flex
0806d000-08074000 rw-p 0806d000 00:00 0
09060000-090a5000 rw-p 09060000 00:00 0
b7fb9000-b7fbb000 rw-p b7fb9000 00:00 0
b7fc3000-b7fc4000 rw-p b7fc3000 00:00 0
bfaaf000-bfac4000 rw-p bfaaf000 00:00 0          [stack]
【広告】