Project

General

Profile

Actions

Bug #5013

closed

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

Added by kosaki (Motohiro KOSAKI) over 13 years ago. Updated over 11 years ago.

Status:
Closed
Target version:
ruby -v:
-
Backport:
[ruby-dev:44078]

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 に入れてしまいたいので

Updated by kosaki (Motohiro KOSAKI) over 13 years ago

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

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

Updated by kosaki (Motohiro KOSAKI) over 13 years ago

  • Status changed from Assigned to Closed

r32490.

Actions

Also available in: Atom PDF

Like0
Like0Like0