Bug #5013

bootstrap/runner.rb の assert_normal_exit() がSEGVを検知できないことがある

Added by Motohiro KOSAKI about 4 years ago. Updated over 2 years ago.

[ruby-dev:44078]
Status:Closed
Priority:Normal
Assignee:Motohiro KOSAKI
ruby -v:- Backport:

Description

Bug#4992 をコミットしようとして気づいたのですが、
bootstrap/runner.rb の assert_normal_exit() がSEGVを検知しそこねることがあります。原因は

1.assert_normal_exit はシグナルで死んだ場合のみ F. exit(1) はテスト成功とみなす
2.rubyのsigsegv()はnested SEGVが起きたときに exit(SIGSEGV) でも abort() でもなく、exit(EXIT_FAILURE) を使う

の2つの仕様の不整合にあります。どちらも現在の仕様になっている理由が更新履歴から読み取れなかったので
どちらを直すべきか迷っています。
#(1)はakrさんが最初にこの関数を作ったときからの仕様、(2)はYARVがマージされた時からの仕様です。

お手数ですが、アドバイスお願いできないでしょうか。1.9.3 に入れてしまいたいので

History

#1 Updated by Motohiro KOSAKI about 4 years ago

何人かの人と相談のうえ、結局 rubyのsigsegvを直すことにしました。今後は
・普通のSEGV
→ rb_bug()経由でabrot()
・SEGV中にさらにSEGV
→ 直接abort() を呼ぶ

のようになり、統一された動作となります。
後から気づいたのですが、さらにいうと、exit()はasync signal safe じゃないので元々論外でした。
exit()は内部でロック取るのでデッドロックリスクあり。

#2 Updated by Motohiro KOSAKI about 4 years ago

  • Status changed from Assigned to Closed

Also available in: Atom PDF