[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24624] ARGF.read(10) dumps core

From: Tanaka Akira <akr@...17n.org>
Date: 2004-10-27 23:42:02 UTC
List: ruby-dev #24624
次のようにすると core を吐きます。

% ./ruby -e '$stdin = Object.new; p ARGF.read(10)'
-e:1: [BUG] Segmentation fault
ruby 1.9.0 (2004-10-28) [i686-linux]

この原因は、argf_forward の引数の増加に対し、呼び出しがひとつ追随して
いないことのようです。

[ruby-dev:24489] で指摘した rb_reg_initialize もそうでしたが、この類の
問題は ANSI スタイルの関数定義を行なえばコンパイラが問題を指摘してくれ
ます。

Index: io.c
===================================================================
RCS file: /src/ruby/io.c,v
retrieving revision 1.310
diff -u -p -r1.310 io.c
--- io.c	27 Oct 2004 09:29:25 -0000	1.310
+++ io.c	27 Oct 2004 23:40:14 -0000
@@ -4131,8 +4131,8 @@ rb_io_s_for_fd(argc, argv, klass)
 static int binmode = 0;
 
 static VALUE
-argf_forward(argv)
-    VALUE *argv;
+argf_forward(
+    VALUE *argv)
 {
     return rb_funcall3(current_file, ruby_frame->last_func, ruby_frame->argc, argv);
 }

というように変えると、次のようにコンパイラが問題を検出してくれます。

% make io.o
gcc -g -O2   -I. -I.  -c io.c
io.c: In function `argf_read':
io.c:5227: error: too few arguments to function `argf_forward'
make: *** [io.o] Error 1

今後も起こり得るこのような問題を未然に防ぐために、ANSI スタイル
に移行することはないのでしょうか?

Index: io.c
===================================================================
RCS file: /src/ruby/io.c,v
retrieving revision 1.310
diff -u -p -r1.310 io.c
--- io.c	27 Oct 2004 09:29:25 -0000	1.310
+++ io.c	27 Oct 2004 23:33:25 -0000
@@ -5224,7 +5224,7 @@ argf_read(argc, argv)
 	return str;
     }
     if (TYPE(current_file) != T_FILE) {
-	tmp = argf_forward();
+	tmp = argf_forward(argv);
     }
     else {
 	tmp = io_read(argc, argv, current_file);
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next