Skip to content
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
Closed

Comments

@pocke
Copy link

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]
@ujihisa
Copy link
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
Copy link
Member

mattn commented Sep 23, 2017

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

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

@ujihisa
Copy link
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
Copy link
Member

mattn commented Sep 23, 2017

おっ!初 contribute ?

@ujihisa
Copy link
Member

ujihisa commented Sep 23, 2017

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

@mattn
Copy link
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
Copy link
Member

mattn commented Sep 23, 2017

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

@mattn
Copy link
Member

mattn commented Sep 23, 2017

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

@mattn
Copy link
Member

mattn commented Sep 23, 2017

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

@ujihisa
Copy link
Member

ujihisa commented Sep 23, 2017

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

@mattn++

@pocke
Copy link
Author

pocke commented Sep 23, 2017

ありがとうございます 🙏

@k-takata
Copy link
Member

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

@ujihisa
Copy link
Member

ujihisa commented Oct 30, 2017

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

@k-takata
Copy link
Member

k-takata commented Nov 2, 2017

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

@ujihisa
Copy link
Member

ujihisa commented Jun 20, 2018

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

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

No branches or pull requests

4 participants