>   http://www.ruby-lang.org/
> 
> 試してみてください。直前までわさわさしてたのがちょっと不安で
> はありますが。

こんなことをする人は、実際にはいないですが、
packした文字列をreplaceの引数に指定した場合のみ、
文字列が共有化されてしまいます。

ary = ["0"]
s1 = ary.pack("p")
s2 = ""
s2.replace(s1)

p s2             # => "xb\017\010"
s1.slice!(0,1)
p s2             # => "b\017\010\000"


以下の修正で大丈夫と思いますが、どうでしょうか?

--- string.c	Mon Dec 25 15:29:10 2000
+++ /home/kosako/ruby/string.c	Mon Dec 25 17:49:08 2000
@@ -1316,15 +1316,19 @@
 rb_str_replace_m(str, str2)
     VALUE str, str2;
 {
+    if (str == str2) return str;
     if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2);
-    rb_str_modify(str);
 
-    if (RSTRING(str2)->orig && FL_TEST(str2, STR_NO_ORIG)) {
+    if (RSTRING(str2)->orig && !FL_TEST(str2, STR_NO_ORIG)) {
+	if (str_independent(str))
+	  free(RSTRING(str)->ptr);
+
 	RSTRING(str)->len = RSTRING(str2)->len;
 	RSTRING(str)->ptr = RSTRING(str2)->ptr;
 	RSTRING(str)->orig = RSTRING(str2)->orig;
     }
     else {
+	rb_str_modify(str);
 	rb_str_resize(str, RSTRING(str2)->len);
 	memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len);
     }
---
小迫@ソフネック        渋谷区恵比寿1-15-1