Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Vim7.3.973でsearch("[^\x01-\x7e]", 'n')でCaught deadly signal ABRT #386

Closed
itchyny opened this Issue · 60 comments

7 participants

itchyny MURAOKA Taro thinca mattn Shougo h_east K.Takata
itchyny

OS: Mac OS X
Vim 7.3 1-973 --with-features=huge --enable-multibyte
Vim 7.3.1-967ではこの問題は生じない

再現方法

 $ src/vim -u NONE --noplugin -c "echo search(\"[^\\x01-\\x7e]\", 'n')"

(このsearchは, http://www.kawaz.jp/pukiwiki/?vim#cb691f26 のものです)

エラー内容

Vim: Caught deadly signal ABRT
Vim: Finished.
zsh: abort      src/vim -u NONE --noplugin -c "echo search(\"[^\\x01-\\x7e]\", 'n')"

期待する挙動: エラー無しに0と表示, 落ちない.

 $ src/vim -u NONE --noplugin -c "echo search(\"[\\x01-\\x7e]\", 'n')"

(^抜き)だと, SEGVになります.

MURAOKA Taro
Owner

原因は 970 ですねわかりますw

MURAOKA Taro
Owner

970 は阿鼻叫喚な感じやね。

thinca
Owner

本家の方でも落ちる報告は何件か来ているようですが、具体的な落ちるコードを示している人はまだ居ない?

MURAOKA Taro
Owner
thinca
Owner

お、ほんとだ。

mattn
Owner

あきらかになんかのバッファが足りてないね。

:echo search("[^\x48-\x7e]", 'n')

だとokで

:echo search("[^\x47-\x7e]", 'n')

だとng

thinca
Owner

これ、テストも足した方が良さそうな気がしますね。

mattn
Owner

NFA_STACK_SIZE の値が少ないっぽい。

mattn
Owner

ところで

$ vim regexp.c

しただけで落ちますね。かわいいですね。

mattn
Owner

レンジでありあえるパターンを生成しているようなのだけど、そのスタックが足りないっぽい。
(まだ未確定)
とりあえずこれで落ちなくはなったが。

mattn
Owner

$ vim arabic.c でも落ちるね。

mattn
Owner

なんか根本的にアタリ方を間違ってる気がしてる。

Shougo
Collaborator

これではうかつにVimをアップデートできないですね……。

mattn
Owner

むー。

で arabic.c も落ちなくはなったけど、なんか根本マズってるのかな。
itchyny
:echo search("[^A-z]")

のほうが報告しやすい

thinca
Owner

全然試せてないんですが、現状 vim_dev に出ているパッチはこの件とは別件ってことですかね?
だとしたらこっちはこっちで報告した方が良いかもしれませんね。

MURAOKA Taro
Owner

いまこんなことを提案するか迷い中

7.3 は stable と認識されている。
970 はかなり unstable だから revert すべき。
7.3からは revert した上で 7.4a (alpha or beta) を unstable でリリースして
その上で 730 を brush up しよう。

どうだろう?

MURAOKA Taro
Owner

とりあえず一報だけはしておきました。

https://groups.google.com/d/msg/vim_dev/niZ0QTP1ucw/AG0yxPkueWYJ

@itchyny Thanks! その例、使わせてもらいました。

Shougo
Collaborator

7.3 は stable と認識されている。
970 はかなり unstable だから revert すべき。
7.3からは revert した上で 7.4a (alpha or beta) を unstable でリリースして
その上で 730 を brush up しよう。

はい。その提案に賛成です。テスト不足なので、730は一度revertするべきでしょうね……。

h_east
Owner

暫定対策
.vimrc に set re=1 と書けばNFA正規表現エンジンを使わなくなるので落ちなくなります。

K.Takata
Owner

いまこんなことを提案するか迷い中

提案するに +1

MURAOKA Taro
Owner

set re=1 と書けばNFA正規表現エンジンを使わなくなる

こっちをデフォにするのでも良いかもね。

thinca
Owner

提案に +1

こっちをデフォにするのでも良いかもね。

設定変えただけでクラッシュする恐れがあるのはさすがにつらいです。

K.Takata
Owner

2152行目辺り、lallocしたサイズとは無関係にstack_endを設定しているのが気になります。
lallocのサイズに、NFA_STACK_SIZE 足せばいいのかな?

    /* Allocate space for the stack. Max states on the stack : nstate */
    stack = (Frag_T *) lalloc((nstate + 1)*sizeof(Frag_T), TRUE);
    stackp = stack;
    stack_end = stack + NFA_STACK_SIZE;

後は、PUSH(), st_push() がスタックがいっぱいになってもエラーを返さないのが気になります。

NFA_SPLIT = -1024 は、NFA_STACK_SIZE とは関係なさそう。普通の文字と区別できるように、NFA_* な enum がすべて負の値になっていればよいのではないかと予想。

mattn
Owner

後は、PUSH(), st_push() がスタックがいっぱいになってもエラーを返さないのが気になります。

そこが問題みたいです。ただ、通常あるケースなので「それってどうなの」と思ってます。

MURAOKA Taro
Owner

エラー検出して、エラーがあったら古い正規表現に切り替えるとかできないかしら?

mattn
Owner

valgrantd してもむずいなー。

mattn
Owner

そもそも正規表現が前と同じ動きをしてない。

thinca
Owner

そもそも互換性がないんですね…。だとするとなおさら revert して貰わないと、既存のスクリプトに大きな影響が出ますね。

mattn
Owner

新しいエンジンだと \= が動いてないっぽい。

thinca
Owner

実装漏れですかね。

mattn
Owner

twitvim で URL のハイライトが970未満と以上だと異なりますね。

Shougo
Collaborator

Vim 7.4でも入るか怪しくなって来ましたね……。Vim本体に正規表現のテストってあるのでしょうか?
それに通るかどうか確かめる or 正規表現のテストを追加するというのはどうでしょう。

mattn
Owner
diff -r 0917206e7317 src/regexp_nfa.c
--- a/src/regexp_nfa.c  Sun May 19 22:31:18 2013 +0200
+++ b/src/regexp_nfa.c  Mon May 20 16:45:04 2013 +0900
@@ -15,8 +15,6 @@
 #define        NFA_BRACES_MAXLIMIT         10
 /* For allocating space for the postfix representation */
 #define        NFA_POSTFIX_MULTIPLIER      (NFA_BRACES_MAXLIMIT + 2)*2
-/* Size of stack, used when converting the postfix regexp into NFA */
-#define        NFA_STACK_SIZE          1024

 enum
 {
@@ -238,7 +236,7 @@
    return FAIL;
     vim_memset(post_start, 0, postfix_size);
     post_ptr = post_start;
-    post_end = post_start + postfix_size;
+    post_end = post_start + nstate_max;
     nfa_has_zend = FALSE;

     regcomp_start(expr, re_flags);
@@ -2152,7 +2150,7 @@
    /* Allocate space for the stack. Max states on the stack : nstate */
    stack = (Frag_T *) lalloc((nstate + 1)*sizeof(Frag_T), TRUE);
    stackp = stack;
-   stack_end = stack + NFA_STACK_SIZE;
+   stack_end = stack + (nstate + 1);
     }

     for (p = postfix; p < end; ++p)

とりあえず落ちないようにはなりました。

mattn
Owner

でもこのレベルの間違い(構造体ポインタに + する値がオフセットじゃなくてバイト数になってた)が入ってるとしたら、結構恐ろしいコードかもw

mattn
Owner

ひとまず誰か試して貰えませんか?
これとtwitvimのハイライトがおかしいのは別な気がするので、こっちからやっつけたい。

mattn
Owner

webapi#json もこのバグのおかげでおかしくなって post できねぇw

mattn
Owner

影響でかすぎるなこのバグ

mattn
Owner

[[:cntrl:]] の動きが変わった様だ。

mattn
Owner

マルチバイト文字が [[:cntrl:]] になってるwwwwwwww

K.Takata
Owner

とりあえず落ちないようにはなりました。

stack_end のサイズが一致していないのは、上に書いたとおり気付いていましたが、post_end は気付きませんでした。
(手元だと、stack_end の修正だけで落ちないようになっていたので。)

マルチバイト文字が [[:cntrl:]] になってるwwwwwwww

ひぃ!

MURAOKA Taro
Owner

ちょっと new regexp engine のいけてないところ一覧にできませんか?
それを突きつけて revert かデフォルトオフかの選択を迫るべきでしょう。

K.Takata
Owner

Vim本体に正規表現のテストってあるのでしょうか?

test64 が正規表現のテストです。今回のパッチで一緒に test64 も強化されていますし、さらにマルチバイトの正規表現のテストとして test95 が追加されています。
ただ、それでもテストが全然足りないので、syntaxファイル作者に対してサンプルをたくさんくれーと言っているのが現在の状況です。

K.Takata
Owner

test64にマルチバイトのテストが1件残ってるなあ。test95に移動が必要。
さらにtest95は enc=cp932 などだとテストが通らない。

mattn
Owner

あー、webapi#json が動かないのは \uXXXX を使ってるからか。だいぶ困る。

Shougo
Collaborator

test64 が正規表現のテストです。今回のパッチで一緒に test64 も強化されていますし、さらにマルチバイトの正規表現のテストとして test95 が追加されています。
ただ、それでもテストが全然足りないので、syntaxファイル作者に対してサンプルをたくさんくれーと言っているのが現在の状況です。

ああ、そういうことなんですね。理解しました。neocomplcache等でも正規表現は多用しているので、かなり影響が出そうです。

mattn
Owner

ちょっと new regexp engine のいけてないところ一覧にできませんか?
それを突きつけて revert かデフォルトオフかの選択を迫るべきでしょう。

  • マルチバイト文字が [[:cntrl:]]
  • 落ちる(暫定パッチあり)
  • 幾らかのプラグインで誤動作が見られる
K.Takata
Owner

[[:alpha:]] とかの判定もおかしいですね。
check_char_class() の中で、マルチバイト文字もお構いなしに isalpha() などに放り込んでる。

MURAOKA Taro
Owner

@mattn Bram が 975 で修正したっぽいが… なんかコレだとダメっぽくない?
https://groups.google.com/d/msg/vim_dev/G5z61R4XcXA/QksltkyRKyUJ

K.Takata
Owner

post_endの方だけ修正されててstack_endが直ってないですね。落ちました。

K.Takata
Owner

regexp_nfa.c 1094行目のこれは何だろう。

            if (*regparse == 'n' || *regparse == 'n')
MURAOKA Taro
Owner

post_endの方だけ修正されててstack_endが直ってないですね。落ちました。

落ちるパターン、教えてください。
975 のスレッドに直接投げてくれても良いです。

regexp_nfa.c 1094行目のこれは何だろう。

www

K.Takata
Owner

:echo search("[^A-z]") で落ちます。(Win7)

K.Takata
Owner

あれ?間違ったかも。

K.Takata
Owner

がーん、古いVimが起動しっぱなしでビルドがエラーになってた。落ちなくなりました。
でもやっぱり stack_end も何らかの修正がいるのではないかなあ。

MURAOKA Taro
Owner

:echo search("[^A-z]") で落ちます。

試してみたけど落ちなかった (´・ω・`) debug.log にこんなん入ってたから、NFAに回ってない。

NFA engine could not handle "[^A-z]"

itchyny

私の手元(Mac OS X)では, 976まで来てこのissueの最初のsearch()は落ちなくなりました.

以下全部落ちないです.

 $ src/vim -u NONE --noplugin -c "echo search(\"[^\\x01-\\x7e]\", 'n')"
 $ src/vim -u NONE --noplugin -c "echo search(\"[\\x01-\\x7e]\", 'n')"
:echo search("[^A-z]")

しかし, mattnさんのご指摘によると, まだ既存の挙動と異なる部分があるようです.
このissueはどうしますか?

  • タイトルを変えて, ここで継続する
  • 一旦閉じて, new regex engine関連の新しいissueを立てる. 「regexp_nfa.cの問題点と改善スレッド」
MURAOKA Taro
Owner

ええい、もうなるようになれ… (´・ω・`)

MURAOKA Taro
Owner

976まで来てこのissueの最初のsearch()は落ちなくなりました.

なのでこちらは閉じます。

一旦閉じて, new regex engine関連の新しいissueを立てる.

#390 で続きをやります。

MURAOKA Taro koron closed this
itchyny

ありがとうございました

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.