[ネタ] GNU Flexのバグ:定数定義が長いと死ぬ
上(前)の記事の最後にFlexがBuffer Overflowで死ぬと書いたけど、原因は正規表現が長いことではなくて、定数定義(?)のバッファが固定長であるためだった。
結論から言うと、俺のやりたいこと(FlexでUnicodeプロパティを使う)を行うためには、\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]