From: nobu.nakada@... Date: 2003-08-26T18:29:18+09:00 Subject: [ruby-dev:21264] Re: Regexp#initializeが $SAFE==4 で落ちる なかだです。 At Tue, 26 Aug 2003 09:38:35 +0900, Yukihiro Matsumoto wrote: > |http://mput.dip.jp:8080/mput/?date=20030825#p02 の話です。 > | > |rb_warnでwarningを表示しようとしたところでSecurityErrorに > |なっているようです。 > > 仕様ではないかと。 > > * $SAFE=4では出力は禁止 > * 警告の出力は必要 > > ですから、警告を活かしたいなら$stderrを置き換える必要があり > ますね。 rb_bug()でもrb_warn()を使っているので、abort()せずに例外になっ てしまう可能性があります。出力されない警告よりも、最初から例外 にしてしまうほうがマシではないでしょうか。 Index: error.c =================================================================== RCS file: /cvs/ruby/src/ruby/error.c,v retrieving revision 1.77 diff -u -2 -p -r1.77 error.c --- error.c 15 Aug 2003 03:01:52 -0000 1.77 +++ error.c 26 Aug 2003 08:59:32 -0000 @@ -111,9 +111,14 @@ warn_print(fmt, args) va_list args; { - char buf[BUFSIZ]; + char buf[BUFSIZ+1]; + int len; + if (ruby_safe_level >= 4) { + rb_exc_raise(rb_exc_new2(rb_eSecurityError, buf)); + } err_snprintf(buf, BUFSIZ, fmt, args); + len = strlen(buf); + strcpy(&buf[len], "\n"); rb_write_error(buf); - rb_write_error("\n"); } @@ -182,4 +187,5 @@ rb_bug(fmt, va_alist) va_list args; + if (ruby_safe_level >= 4) abort(); snprintf(buf, BUFSIZ, "[BUG] %s", fmt); ruby_in_eval = 0; @@ -188,7 +194,6 @@ rb_bug(fmt, va_alist) warn_print(buf, args); va_end(args); - snprintf(buf, BUFSIZ, "ruby %s (%s) [%s]\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM); + snprintf(buf, BUFSIZ, "ruby %s (%s) [%s]\n\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM); rb_write_error(buf); - rb_write_error("\n"); abort(); } @@ -759,5 +764,5 @@ rb_sys_fail(mesg) errno = 0; if (n == 0) { - rb_bug("rb_sys_fail() - errno == 0"); + rb_bug("rb_sys_fail(%s) - errno == 0", mesg ? mesg : ""); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦