New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

:rubyfile を実行中に例外が発生すると、segmentation fault する #1098

Closed
pocke opened this Issue Sep 23, 2017 · 15 comments

Comments

Projects
None yet
4 participants
@pocke

pocke commented Sep 23, 2017

質問・報告の内容

:rubyfileを実行中に例外が発生すると、segmentation fault します

再現手順

test.rb として置く

raise

vim を起動

$ vim -u NONE

:rubyfile ./test.rb を実行する

# 出力

Vim: Caught deadly signal SEGV
Vim: Finished.
zsh: segmentation fault (core dumped)  vim -u NONE

なお、:ruby raise を実行してもE272: Unhandled exception が出るだけで、segmentation fault はしません(rubyfile を使用したときのみ再現します)。

他の言語について

Python で試しましたが、segmentation fault はせず、エラーメッセージが表示されました。

raise NameError('err')
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "./test.py", line 1, in <module>
    raise NameError('err')
NameError: err
Press ENTER or type command to continue

ruby, python 以外の言語では試せていないです。

期待する挙動

segmentation fault ではなく、(pythonの例のように)何らかのエラーメッセージが出る、などの挙動を期待しています。
何故ならば、segmentation fault されるとデバッグが困難だからです(どのようなエラーが起きたかすらわからない)

Vimのバージョン

$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Sep 19 2017 13:59:47)
Included patches: 1-1127
Compiled by Arch Linux
Huge version with GTK3 GUI.  Features included (+) or not (-):
+acl             +file_in_path    +mouse_sgr       +tag_old_static
+arabic          +find_in_path    -mouse_sysmouse  -tag_any_white
+autocmd         +float           +mouse_urxvt     +tcl/dyn
+balloon_eval    +folding         +mouse_xterm     +termguicolors
+browse          -footer          +multi_byte      +terminal
++builtin_terms  +fork()          +multi_lang      +terminfo
+byte_offset     +gettext         -mzscheme        +termresponse
+channel         -hangul_input    +netbeans_intg   +textobjects
+cindent         +iconv           +num64           +timers
+clientserver    +insert_expand   +packages        +title
+clipboard       +job             +path_extra      +toolbar
+cmdline_compl   +jumplist        +perl/dyn        +user_commands
+cmdline_hist    +keymap          +persistent_undo +vertsplit
+cmdline_info    +lambda          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python/dyn      +viminfo
+cscope          +lispindent      +python3/dyn     +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con_gui  +lua/dyn         +rightleft       +windows
+diff            +menu            +ruby/dyn        +writebackup
+digraphs        +mksession       +scrollbind      +X11
+dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     +xim
+emacs_tags      +mouseshape      +startuptime     -xpm
+eval            +mouse_dec       +statusline      +xsmp_interact
+ex_extra        +mouse_gpm       -sun_workshop    +xterm_clipboard
+extra_search    -mouse_jsbterm   +syntax          -xterm_save
+farsi           +mouse_netterm   +tag_binary      
   system vimrc file: "/etc/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "/etc/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/harfbuzz -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -D_FORTIFY_SOURCE=2  -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1       
Linking: gcc   -L. -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.26/core_perl/CORE  -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -L/usr/local/lib -Wl,--as-needed -o vim   -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXt -lX11 -lXdmcp -lSM -lICE  -lm -lncurses -lelf -lnsl    -lacl -lattr -lgpm -ldl   -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.26/core_perl/CORE -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fstack-protector-strong -L/usr/local/lib  -L/usr/lib/perl5/5.26/core_perl/CORE -lperl -lpthread -lnsl -ldl -lm -lcrypt -lutil -lc   -L/usr/lib -ltclstub8.6 -ldl -lz -lpthread -lieee -lm     

OSの種類/ディストリ/バージョン

  • Arch Linux

使用している or 関係していそうなプラグイン

vim -u NONE で再現したので、プラグインは特に関係はないと思います

その他

Ruby のバージョン

$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]

@k-takata k-takata added the kind/bug label Sep 23, 2017

@ujihisa

This comment has been minimized.

Show comment
Hide comment
@ujihisa

ujihisa Sep 23, 2017

Member

同じくarchlinuxです。

  • vim 8.0.1137, vim 8.0.0000, vim 7.3.939などでも再現を確認
  • rbenv経由しないruby 2.4.2p198で再現を確認
  • rbenv経由したruby 2.3.1p112で再現を確認
  • rbenv経由したruby開発最新版(ruby 2.5.0dev (2017-09-23 trunk 59996) [x86_64-linux])で再現 しない ことを確認。ただしSEGVしないのではなく、単に何も実行されない (ひどい)

(Gentoo Linuxでもざっとみたところ再現を確認)

Member

ujihisa commented Sep 23, 2017

同じくarchlinuxです。

  • vim 8.0.1137, vim 8.0.0000, vim 7.3.939などでも再現を確認
  • rbenv経由しないruby 2.4.2p198で再現を確認
  • rbenv経由したruby 2.3.1p112で再現を確認
  • rbenv経由したruby開発最新版(ruby 2.5.0dev (2017-09-23 trunk 59996) [x86_64-linux])で再現 しない ことを確認。ただしSEGVしないのではなく、単に何も実行されない (ひどい)

(Gentoo Linuxでもざっとみたところ再現を確認)

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 23, 2017

Member

いま成瀬さんに尋ねてますが、vim に関係なく落ちる模様。

https://gist.github.com/mattn/a657837cb83db0077f705755f34b4cab

Member

mattn commented Sep 23, 2017

いま成瀬さんに尋ねてますが、vim に関係なく落ちる模様。

https://gist.github.com/mattn/a657837cb83db0077f705755f34b4cab

@ujihisa

This comment has been minimized.

Show comment
Hide comment
@ujihisa

ujihisa Sep 23, 2017

Member

ruby側の根本原因はわかってないけど、これで直ることは確認できました。

diff --git a/src/if_ruby.c b/src/if_ruby.c
index c1b42e675..a40901bbf 100644
--- a/src/if_ruby.c
+++ b/src/if_ruby.c
@@ -831,7 +831,7 @@ void ex_rubyfile(exarg_T *eap)

     if (ensure_ruby_initialized())
     {
-	rb_load_protect(rb_str_new2((char *) eap->arg), 0, &state);
+	rb_protect((VALUE (*)(VALUE))rb_load, rb_str_new2((char *) eap->arg), &state);
 	if (state) error_print(state);
     }
 }

:h :rubyfile によると、

							*:rubyfile* *:rubyf*
:rubyf[ile] {file}	Execute the Ruby script in {file}.  This is the same as
			`:ruby load 'file'`, but allows file name completion.

とのことなので、むしろこっちの方がよさそう感

Member

ujihisa commented Sep 23, 2017

ruby側の根本原因はわかってないけど、これで直ることは確認できました。

diff --git a/src/if_ruby.c b/src/if_ruby.c
index c1b42e675..a40901bbf 100644
--- a/src/if_ruby.c
+++ b/src/if_ruby.c
@@ -831,7 +831,7 @@ void ex_rubyfile(exarg_T *eap)

     if (ensure_ruby_initialized())
     {
-	rb_load_protect(rb_str_new2((char *) eap->arg), 0, &state);
+	rb_protect((VALUE (*)(VALUE))rb_load, rb_str_new2((char *) eap->arg), &state);
 	if (state) error_print(state);
     }
 }

:h :rubyfile によると、

							*:rubyfile* *:rubyf*
:rubyf[ile] {file}	Execute the Ruby script in {file}.  This is the same as
			`:ruby load 'file'`, but allows file name completion.

とのことなので、むしろこっちの方がよさそう感

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 23, 2017

Member

おっ!初 contribute ?

Member

mattn commented Sep 23, 2017

おっ!初 contribute ?

@ujihisa

This comment has been minimized.

Show comment
Hide comment
@ujihisa

ujihisa Sep 23, 2017

Member

(///
これ再現テストどんなふうに書くと良いかなあ

Member

ujihisa commented Sep 23, 2017

(///
これ再現テストどんなふうに書くと良いかなあ

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 23, 2017

Member

こんなのを testdir/test_ruby.vim に足せばよいかと。

func Test_rubyfile()
  let tempfile = tempname() . '.rb'
  call writefile(['raise "vim!"'], tempfile)
  call assert_fails('rubyfile ' . tempfile)
  call delete(tempfile)
endfunc
Member

mattn commented Sep 23, 2017

こんなのを testdir/test_ruby.vim に足せばよいかと。

func Test_rubyfile()
  let tempfile = tempname() . '.rb'
  call writefile(['raise "vim!"'], tempfile)
  call assert_fails('rubyfile ' . tempfile)
  call delete(tempfile)
endfunc
@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 23, 2017

Member

出来れば assert_fails の第2引数でエラーがチェック出来ればいいけど。

Member

mattn commented Sep 23, 2017

出来れば assert_fails の第2引数でエラーがチェック出来ればいいけど。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 23, 2017

Member

あ、再現テストは普通に状況説明でいいかと。

Member

mattn commented Sep 23, 2017

あ、再現テストは普通に状況説明でいいかと。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 23, 2017

Member

@ujihisa あとは pull-req までお願いしていいですか?

Member

mattn commented Sep 23, 2017

@ujihisa あとは pull-req までお願いしていいですか?

@ujihisa

This comment has been minimized.

Show comment
Hide comment
@ujihisa

ujihisa Sep 23, 2017

Member

おお、それでやっておきます!

@mattn++

Member

ujihisa commented Sep 23, 2017

おお、それでやっておきます!

@mattn++

@pocke

This comment has been minimized.

Show comment
Hide comment
@pocke

pocke Sep 23, 2017

ありがとうございます 🙏

pocke commented Sep 23, 2017

ありがとうございます 🙏

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Oct 30, 2017

Member

なぜか 8.0.1236 の一部として取り込まれていたので、意図的なのか確認中。

Member

k-takata commented Oct 30, 2017

なぜか 8.0.1236 の一部として取り込まれていたので、意図的なのか確認中。

@ujihisa

This comment has been minimized.

Show comment
Hide comment
@ujihisa

ujihisa Oct 30, 2017

Member

(slackにも書いたけど本件謎が多い...!)

Member

ujihisa commented Oct 30, 2017

(slackにも書いたけど本件謎が多い...!)

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Nov 2, 2017

Member

事故で取り込まれてしまったとのことでしたが、パッチファイルのコメントが更新されて、一応公式なものとなりました。
http://ftp.vim.org/pub/vim/patches/8.0/8.0.1236
+ruby/dyn の場合はこれでもまだテストが失敗するらしく、テストの部分は取り込まれていません。Ruby本体の問題なので、Vim側ではおそらくどうにもならないのではないかと思いますが…。

Member

k-takata commented Nov 2, 2017

事故で取り込まれてしまったとのことでしたが、パッチファイルのコメントが更新されて、一応公式なものとなりました。
http://ftp.vim.org/pub/vim/patches/8.0/8.0.1236
+ruby/dyn の場合はこれでもまだテストが失敗するらしく、テストの部分は取り込まれていません。Ruby本体の問題なので、Vim側ではおそらくどうにもならないのではないかと思いますが…。

@ujihisa

This comment has been minimized.

Show comment
Hide comment
@ujihisa

ujihisa Jun 20, 2018

Member

最終的に根本解決がだいぶ前に入ったのでこれも閉じ

Member

ujihisa commented Jun 20, 2018

最終的に根本解決がだいぶ前に入ったのでこれも閉じ

@ujihisa ujihisa closed this Jun 20, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment