[Gauche-devel-jp] [0.9.5_pre2] stack overrun during matching regexp

Back to archive index

Shiro Kawai shiro****@gmail*****
2016年 8月 20日 (土) 18:29:34 JST


私の環境だと2726までいけました。

gosh> (test3 (make-str "a" 2726))
2726
#f
gosh> (test3 (make-str "a" 2727))
2727
*** ERROR: stack overrun during matching regexp #/([0-9]+abc)?(.*)\{.*abc\}/
Stack Trace:
_______________________________________
  0  (eval expr env)
        at "/usr/share/gauche-0.9/0.9.5_pre2/lib/gauche/interactive.scm":282

stack overrunはマシンスタックのアドレスを見てるので、どこまでいけるかはスタックフレームに
依存し、コンパイラやアーキテクチャで変わります。0.9.4でもどこかでエラーになると思います。

で、許容量があんまり小さいと不便なんですが、そもそもこのエラーを起こす正規表現は
NFAではマッチにやたら時間がかかる可能性があるので、できれば正規表現自体を
見直すことができればその方がいいのですが… 最後の #/{.*abc}/ の手前に '{' 等が
現れる可能性は許容しないとまずいですか? それが無くていいなら

    #/([0-9]+abc)?([^{]*){.*abc}/

にするとstack overrunは起こらなくなります。#/(.*){/ の場合、途中で '{' を見つけても、
それ以降のマッチに失敗したら戻ってやり直さないとならないので途中経過をいちいち
覚えておく必要があるんですが、 #/([^{]*){/ なら '{' を見つけるまでどんどん先に進めるので
速いです。

(実際には、元のregexpでも '{' が見えない限りリスタートの可能性がないのでそこを
ちゃんとやればスタック消費はうんと抑えられるんですが、今はサボってるので
(.*) の部分は一文字ごとにリスタートをスタックに積むようになってます。
あんまり問題になるようなら対応を考えます。)




2016-08-19 23:01 GMT-10:00 osamu ogurisu <oguri****@gmail*****>:

> こんにちは、小栗栖です。
>
> こちらに書くのは久しぶりです。
>
> 青空文庫のテキストからlatexのソースを出力するスクリプトを書いて遊んで
> いたのですが、先日の 0.9.5_pre2 で思いがけず、単純に長い string に
> rxmatch をかけるだけで string overrun during matching regexp になって
> しまいました。
>
> 例えば、
>
> (define (make-str s n) ; 単に長いstringを準備したいだけです。
>   (with-output-to-string
>     (lambda ()
>       (dotimes (i n)
> (display s)))))
> (define (test3 text) ; こっちが本題
>   (print (string-length text))
>   (rxmatch #/([0-9]+abc)?(.*){.*abc}/ text))
>
> に対して次のような実行結果になってしまいました。
>
> gosh> (gauche-version)
> "0.9.5_pre2"
> gosh> (test3 (make-str "a" 1256)) ; こちらは期待通り
> 1256
> #f
> gosh> (test3 (make-str "a" 1257)) ; どうも長さ1256と1257が境のようです。
> 1257
> *** ERROR: stack overrun during matching regexp
> #/([0-9]+abc)?(.*)\{.*abc\}/
> Stack Trace:
> _______________________________________
>   0  (eval expr env)
>         at "/usr/local/share/gauche-0.9/0.9.5_pre2/lib/gauche/
> interactive.scm":282
> gosh>
>
> こちらの環境は debian jessie で、
> 0.9.5-pre2 の make chack は全てpassしています。
>
> $ uname -a
> Linux vivo 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02)
> x86_64 GNU/Linux
> $ gosh -V
> Gauche scheme shell, version 0.9.5_pre2 [utf-8,pthreads],
> x86_64-pc-linux-gnu
>
> なお、jessie の package の gauche-0.9.4 では期待通りの動作になります。
>
> gosh> (gauche-version)
> "0.9.4"
> gosh> (test3 (make-str "a" 1257))
> 1257
> #f
> gosh> (test3 (make-str "a" 1258))
> 1258
> #f
> gosh>
>
> 私の "0.9.5_pre2" の make がおかしいのかもしれませんが、0.9.5 の準備中
> と思いますので、まずは報告しておきます。
>
> 小栗栖
>
>
> _______________________________________________
> Gauche-devel-jp mailing list
> Gauch****@lists*****
> http://lists.osdn.me/mailman/listinfo/gauche-devel-jp
>
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Descargar 



Gauche-devel-jp メーリングリストの案内
Back to archive index